2016-10-19 158 views
0

我有一个名为Table的ruby类,我遍历一个csv文件,为每一行创建这个类的对象,如果这行的第一个元素还没有被看到。随机删除Class'objects

下面是代码:

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

  2. 此外,脚本的每次运行之间的最终计数更改。我有时会得到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​​是否因某些原因删除对象?

回答

1

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

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

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

由于您不在任何地方存储您创建的Table类对象,因此GC将它们视为垃圾并收集。例如,您可以在循环之前通过disable'ing垃圾回收来检查ObjectSpace

+0

感谢您的回答。我知道GC,但是让我感到惊讶的是,它并没有为每次运行删除相同数量的对象 –