2016-10-19 76 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,但是讓我感到驚訝的是,它並沒有爲每次運行刪除相同數量的對象 –