在关系上构建记录时,我遇到了占用太多内存的过程。在谈论这样的代码时应该预料到:
注意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 也无济于事。