我有一个名为Table
的ruby类,我正在迭代一个csv文件,如果还没有看到该行的第一个元素,则为每一行创建一个该类的对象。
以下是代码:
require 'csv'
class Table
def initialize(name)
@name = name
@columns = {}
end
end
csv_tables = File.read("db_apm.csv")
csv_tables = CSV.parse(csv_tables, :headers => true)
csv_tables.each_with_index do |row, index|
# Check if object with the name present at row[0] has already been created
if ObjectSpace.each_object(Table).find { |object| object.instance_variable_get(:@name) == row[0] }.nil?
table = Table.new(row[0])
p row[0]
end
p ObjectSpace.each_object(Table).to_a.count
end
p "Final count"
p ObjectSpace.each_object(Table).to_a.count
csv文件永远不会改变,但我看到一些奇怪的结果:
首先,在每次循环结束前的计数在脚本的同一次运行期间重新开始(我可以看到1,2,3,... 50,1,2,3)。
此外,最终计数在每次运行脚本之间发生变化。我有时会得到17,或者我可以得到204等,这似乎很随机。
我不明白为什么会发生这种情况,因为文件没有改变,而且代码非常简单。
以下是文件的一小部分摘录:
LOG_RECHERCHE
LOG_RECHERCHE
LOG_RECHERCHE
LOG_RECHERCHE
LOG_RECHERCHE
INTERVENTION
INTERVENTION
INTERVENTION
INTERVENTION
INTERVENTION
INTERVENTION
INTERVENTION
INTERVENTION
INTERVENTION
INTERVENTION
INTERVENTION
INTERVENTION
SUIVI_SCRIPT_SQL
SUIVI_SCRIPT_SQL
SUIVI_SCRIPT_SQL
SUIVI_SCRIPT_SQL
VUE_COMPILE_RENCONTRE
VUE_COMPILE_RENCONTRE
VUE_COMPILE_RENCONTRE
VUE_COMPILE_RENCONTRE
VUE_COMPILE_RENCONTRE
VUE_COMPILE_RENCONTRE
为此,最终计数应为4.我不确定文件的一小部分是否会出现问题(对于整个文件,最终计数应该约为200)。
ruby是否因某些原因删除了对象?
答案 0 :(得分:1)
有一个名为garbage collection的内存管理机制。
在Ruby中,它是在GC module中实现的。
它的作用是删除不再使用/引用的对象,以优化内存使用。
由于您没有将创建的atomic_min
类对象存储在任何位置,因此GC将它们视为垃圾,然后收集。
例如,您可以在循环之前检查Table
by disable
'垃圾收集。