Conversation
| ```sessions = sessions + [parse_session(line)] if cols[0] == 'session'``` | ||
| В этом месте было выделено 1.8 Гб памяти | ||
| - Я внес самое главное изменение, это запись данных в потоке. Решил читать файл построчно и сохранять данные в правильном формате JSON по блочно. | ||
| - Вызов метода ```p "MEMORY USAGE: %d MB" % (`ps -o rss= -p #{Process.pid}`.to_i / 1024)``` показал потребление памяти в районе 57 Мб при обработке файла *data_large.txt*. Самый большой файл обрабатывается за 9 секунд |
There was a problem hiding this comment.
9 секунд + константная память на любой объём данных == кайф
| В этом месте было выделено 1.8 Гб памяти | ||
| - Я внес самое главное изменение, это запись данных в потоке. Решил читать файл построчно и сохранять данные в правильном формате JSON по блочно. | ||
| - Вызов метода ```p "MEMORY USAGE: %d MB" % (`ps -o rss= -p #{Process.pid}`.to_i / 1024)``` показал потребление памяти в районе 57 Мб при обработке файла *data_large.txt*. Самый большой файл обрабатывается за 9 секунд | ||
| - Теперь главная точка роста line.chomp.split(','). Так показывает MemoryProfiler, потому что он не дает объектам удаляться потому что профилирует данные. Но я не считаю это точкой роста, потому что без MemoryProfiler программа работает очень быстро и не потребляет память |
There was a problem hiding this comment.
Тут у вас возникла путаница.
MemoryProfiler показывает, что в этой строчке происходит большинство аллокаций, что правильно. В принципе, если их убрать (например, использовать split with block и не создавать постоянно новых строк, то у нас будет создаваться меньше объектов, потом GC не придётся их удалять, и программа будет работать несколько быстрее за счёт этого)
Но эта ситуация не ведёт к росту максимального потребления памяти, потому что эти тысячи строк, которые мы постоянно создаём спокойненько удаляются GC.
Но если у нас включен memory_profiler, то эти объекты могут и не удаляться, так как на них есть ссылки со стороны отчёта memory_profiler
Ещё раз в общем подчеркну, что надо разделять benchmarking (замер метрики) и profiling (поиск точки роста).
| SAVE_TYPE = "a" | ||
| COMMON = "," | ||
| USER_STATS_STR = '{"usersStats":{' | ||
| USER_STATS_CLOSE = '}}' |
There was a problem hiding this comment.
эти все строковые константы не обязательны так как есть #frozen_string_literal: true, и их можно с тем же успехом записать просто как строковые литералы
No description provided.