リレーションにレコードを作成するときに、メモリを大量に消費するプロセスが発生しています。このようなコードについて話すとき、それは予想されるべきです:
Scan
およびItem
はMongoidドキュメントおよびスキャンhas_many
アイテムであることに注意してください。
1000.times do
item = scan.items.build
item.save
end
これらのオブジェクトを保持するためにその関係は必要ないので、最初にバイパスしようとしたのは次のようなものでした。
1000.times do
item = Item.new(scan_id: scan.id)
item.save
end
残念ながら、同じ結果が得られます。ガベージコレクションにはありません。簡単なテストは次のとおりです。
class Foo
end
1000.times do |i|
foo = Foo.new
if i % 100 == 0
ObjectSpace.garbage_collect
puts ObjectSpace.each_object(Foo).count
end
end
# => 1
# => 2
# => 2
# => 2
# => 2
# => 2
# => 2
# => 2
# => 2
# => 2
1000.times do |i|
item = Item.new(scan_id: scan.id)
item.save
if i % 100 == 0
ObjectSpace.garbage_collect
puts ObjectSpace.each_object(Item).count
end
end
# => 100
# => 200
# => 300
# => 400
# => 500
# => 600
# => 700
# => 800
# => 900
# => 1000
scan.items
だから私の質問は、それらのオブジェクトを保持している関係によって引き起こされるメモリを肥大化させることなく、関係の参照を使用してレコードを作成する方法ですか?それも可能ですか?
編集:
たまにメソッドをリロードscan
してreload
も、WeakRefも役に立ちません。