Skip to content

RobBikmansurov/large-file-json

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Задание

Task.rb - Тут находится программа, выполняющая обработку данных из файла. Тест показывает как программа должна работать. В этой программе нужно обработать файл данных data_large.txt.

Ожидания от результата:

  • Корректная обработатка файла data_large.txt;
  • Проведена оптимизация кода и представлены ее результаты;
  • Production-ready код;
  • Применены лучшие практики;

Решение

  1. Входной файл с данными содержит записи по пользователю и его сессиям. Строки отсортированы: сначала идет запись о пользователе, затем записи о его сессиях. Входной файл - большой, поэтому для экономии памяти будем обрабатывать его построчно. Получим промежуточные данные в массиве хешей и будем его обрабатывать для получения нужных итоговых данных в хеше report

  2. На выходе нужно получить файл с отчетом в 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 минут).

Production-ready код;

Сделал исполняемый скрипт для запуска task.rb и вывод ошибок на консоль.

Запуск: ./task.rb либо ./task.rb ИМЯ_ФАЙЛА_С_ДАННЫМИ ИМЯ_ФАЙЛА_ОТЧЕТА

По умолчанию данные берет из data.txt и записывает результат в result.json

Применены лучшие практики;

Использовал RSpec для тестов и rubocop для проверки стиля кода.

About

test - process large data fille for json report

Topics

Resources

Stars

Watchers

Forks

Languages