Task.rb
- Тут находится программа, выполняющая обработку данных из файла.
Тест показывает как программа должна работать.
В этой программе нужно обработать файл данных data_large.txt.
Ожидания от результата:
- Корректная обработатка файла data_large.txt;
- Проведена оптимизация кода и представлены ее результаты;
- Production-ready код;
- Применены лучшие практики;
-
Входной файл с данными содержит записи по пользователю и его сессиям. Строки отсортированы: сначала идет запись о пользователе, затем записи о его сессиях. Входной файл - большой, поэтому для экономии памяти будем обрабатывать его построчно. Получим промежуточные данные в массиве хешей и будем его обрабатывать для получения нужных итоговых данных в хеше report
-
На выходе нужно получить файл с отчетом в json, содержащим различную статистику по пользователям, сессиям, браузероам и т.д.
lib/report_data.rb
- преобразует вх.файл в хеш-объектов для отчета
lib/report_generator.rb
- генератор отчета
lib/report_result.rb
- сохраняет отчет в json.файл
lib/user.rb
- пользователь (для вх.строк вида user,4,Corie,Erika,32
)
lib/session.rb
- сессия пользователя (для вх.строк вида session,4,0,Chrome 11,49,2019-02-05
)
lib/uses_sessions.rb
- набор данных одного пользователя с его сессиями
Есть тесты всех вспомогательных классов и результата
№# Корректная обработка файла data_large.txt;
Файл с данными размером 129МБ обрабатывается примерно за пару минут. Но памяти потребляет 1.7ГБ на пике.
$ time ./task data/data.txt ./result.json
real 1m51,470s
user 1m49,894s
sys 0m1,393s
Из первоначальной программы-образца Task.rb
исключен промежуточный шаг по формированию массивов users и sessions.
Данные из файла сразу при обработке попадают в users_objects. Это ускорило программу (Task.rb у меня не завершался и за 10 минут).
Сделал исполняемый скрипт для запуска task.rb
и вывод ошибок на консоль.
Запуск: ./task.rb
либо ./task.rb ИМЯ_ФАЙЛА_С_ДАННЫМИ ИМЯ_ФАЙЛА_ОТЧЕТА
По умолчанию данные берет из data.txt
и записывает результат в result.json
Использовал RSpec для тестов и rubocop для проверки стиля кода.