Ответ 1
Я не нашел ruby-prof очень полезным, когда дело доходит до обнаружения утечек памяти, потому что вам нужен исправленный интерпретатор Ruby. Отслеживание размещения объектов стало проще в Ruby 2.1. Может быть, это лучший выбор, чтобы изучить это самостоятельно.
Я рекомендую пост в блоге Ruby 2.1: objspace.so от tmml, который является одним из разработчиков ядра Ruby. В основном вы можете получить много информации при отладке вашего приложения:
ObjectSpace.each_object{ |o| ... }
ObjectSpace.count_objects #=> {:TOTAL=>55298, :FREE=>10289, :T_OBJECT=>3371, ...}
require 'objspace'
ObjectSpace.memsize_of(o) #=> 0 /* additional bytes allocated by object */
ObjectSpace.count_tdata_objects #=> {Encoding=>100, Time=>87, RubyVM::Env=>17, ...}
ObjectSpace.count_nodes #=> {:NODE_SCOPE=>2, :NODE_BLOCK=>688, :NODE_IF=>9, ...}
ObjectSpace.reachable_objects_from(o) #=> [referenced, objects, ...]
ObjectSpace.reachable_objects_from_root #=> {"symbols"=>..., "global_tbl"=>...} /* in 2.1 */
С Ruby 2.1 вы можете даже начать отслеживать размещение новых объектов и собирать метаданные о каждом новом объекте:
require 'objspace'
ObjectSpace.trace_object_allocations_start
class MyApp
def perform
"foobar"
end
end
o = MyApp.new.perform
ObjectSpace.allocation_sourcefile(o) #=> "example.rb"
ObjectSpace.allocation_sourceline(o) #=> 6
ObjectSpace.allocation_generation(o) #=> 1
ObjectSpace.allocation_class_path(o) #=> "MyApp"
ObjectSpace.allocation_method_id(o) #=> :perform
Используйте Поддеть и подглядывать-byebug и начать изучать кучу памяти, где вы думаете, это будет, вероятно, расти, соответственно попробовать различные сегменты кода. До Ruby 2.1 я всегда полагался на ObjectSpace.count_objects
и вычислял разницу в результатах, чтобы посмотреть, особенно ли растет один тип объекта.
Сборка мусора работает должным образом, когда число растущих объектов повторно проверяется в гораздо меньшем количестве во время итераций, а не продолжает расти. В любом случае сборщик мусора должен работать все время, вы можете убедиться в этом, просмотрев статистику сборщика мусора.
По моему опыту это либо строка, либо символ (T_STRING
). Символы до ruby 2.2.0 не собирались мусором, поэтому убедитесь, что ваш CSV или его части не преобразуются в символы на пути.
Если вам неудобно, попробуйте запустить свой код на JVM с JRuby. По крайней мере, профилирование памяти намного лучше поддерживается такими инструментами, как VisualVM.