
对于Ruby和Ruby on Rails Junior +,中级开发人员
我们经常在编写代码时没有去研究执行它会占用多少资源。可能还可以。但是,首先,每个普通开发人员都在尝试变得更好,并不断发展自己的技能。其次,这很容易变成根本没有明显根源的真正错误,这个问题仍然需要解决。
神秘的虫子
, CRM Kubernetes. Excel , . Sidekiq - , ( exception-, ). ‘in_progress’, Sidekiq , .
, , , , , . , CRM, , .
""
"" — . , - , . benchmark-memory, :
def benchmark_memory(&block)
  Benchmark.memory do |x|
    x.report('') do
      yield
      GC.start(full_mark: true, immediate_sweep: true) #   Garbage Collector',     
    end
  end
end
Garbage Collector . «» . GC Ruby , . , , . , , 100 GC:
 100    
50.966M memsize (     1.445M retained)
850.405k objects (    24.514k retained)
50.000  strings (    50.000  retained)
  100    
80.554M memsize (   920.363k retained)
 1.303M objects (    17.565k retained)
50.000  strings (    50.000  retained)
, Garbage Collector’, :
benchmark_memory { puts 1 }
Calculating -------------------------------------
1
                       464.000  memsize (     0.000  retained)
                         2.000  objects (     0.000  retained)
                         0.000  strings (     0.000  retained)
, 464 .
:
 100 :
1.482M memsize (     1.480M retained)
24.814k objects (    24.793k retained)
50.000  strings (    50.000  retained)
 1000 :
12.811M memsize (    12.809M retained)
226.587k objects (   226.556k retained)
50.000  strings (    50.000  retained)
100 , 1000 — . — , . , , , ( ). , , .
, , , . Garbage Collector’ 100 — 50 ( ), 500 1000. 38_000 — "" 18,5 ! (38 * 500 = 19_000 =~ 18,5 ).
?
, — , xlsx csv. «», , . , «» , 40% :
 100   xlsx:
1.482M memsize (     1.480M retained)
24.814k objects (    24.793k retained)
50.000  strings (    50.000  retained)
 100   csv:
852.195k memsize (   849.968k retained)
12.034k objects (    12.007k retained)
50.000  strings (    50.000  retained)
2:
:

, , . ReportWorker’ . . , :
  def export_collection(objects_ids)
    Application.where(id: objects_ids.uniq).order(created_at: :desc)
  end
, , ? ActiveRecord find_each:
 def to_csv_export(objects_ids)
    CSV.open(file_path, 'w') do |csv|
      csv << export_headers #    
      export_collection(objects_ids).find_each do |application| #     ,     
        begin
          csv << export_row(application.decorate) #     
        rescue StandardError => e
          errors << "#{application.id}: #{e}"
        end
      end
    end
  end
, :
 100 :
166.688k memsize (   165.445k retained)
1.729k objects (     1.715k retained)
50.000  strings (    50.000  retained)
 1000 :
167.510k memsize (   166.227k retained)
1.734k objects (     1.719k retained)
50.000  strings (    50.000  retained)
, , , , .
:
, , — , 18,5 , 200 . , , , , . , , . . , , .
: 170 ,