2016-10-19 5 views
0

ruby​​クラスTableがあります。この行の最初の要素がまだ表示されていない場合は、すべての行についてこのクラスのオブジェクトを作成するために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. まず、各ループの再起動が終了する前に、カウントをここで

    コードですスクリプトの同じ実行中に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になるはずです)。

何らかの理由でオブジェクトを削除していますか?

答えて

1

garbage collectionというメモリ管理機構があります。

RubyではGC moduleに実装されています。

メモリの使用を最適化するために、使用/参照されなくなったオブジェクトを削除します。

Tableクラスの作成済みオブジェクトをどこにも保存していないため、GCはそれらをゴミとして扱い、収集します。

たとえば、ループの前にdisable 'ガベージコレクションによってObjectSpaceを検査することができます。

+0

あなたの答えに感謝します。私はGCについて知っていましたが、私が驚いたのは、実行ごとに同じ数のオブジェクトを削除しなかったことです –

関連する問題