Class'objects随机删除

时间:2016-10-19 08:36:02

标签: ruby oop

我有一个名为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. 首先,在每次循环结束前的计数在脚本的同一次运行期间重新开始(我可以看到1,2,3,... 50,1,2,3)。

  2. 此外,最终计数在每次运行脚本之间发生变化。我有时会得到17,或者我可以得到204等,这似乎很随机。

  3. 我不明白为什么会发生这种情况,因为文件没有改变,而且代码非常简单。

    以下是文件的一小部分摘录:

    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​​是否因某些原因删除了对象?

1 个答案:

答案 0 :(得分:1)

有一个名为garbage collection的内存管理机制。

在Ruby中,它是在GC module中实现的。

它的作用是删除不再使用/引用的对象,以优化内存使用。

由于您没有将创建的atomic_min类对象存储在任何位置,因此GC将它们视为垃圾,然后收集。

例如,您可以在循环之前检查Table by disable'垃圾收集。