1

以下は、デバイス データベースにレコードを挿入するメソッドです。「メモリの割り当てに失敗しました」というエラーが発生するという問題があります。

メモリが非常に限られている Windows Mobile デバイスで実行されています。

10 個のモデルがあり、そのうちの 1 つは 108,000 レコードというかなり大きなモデルです。

この行 (f.readlines().each do |line|) を実行するとエラーが発生しますが、最大のモデルが既に挿入された後に発生します。

行を反復しているブロックによってメモリが解放されていませんか? それとも何か他のことが起こっていますか?

この問題に関する助けをいただければ幸いです。

def insertRecordsIntoRhom(models)
     updateAmount = 45 / models.length

     GC.enable

     models.each_with_index do |model,i|
        csvColumns = Array.new

        db = ::Rho::RHO.get_src_db(model)
        db.start_transaction
        begin 
           j=0          

           f = File.new("#{model}.csv")
           f.readlines().each do |line|

              #extract columns from header line of csv
              if j==0
                 csvColumns = getCsvFieldFromHeader(line)
                 j+=1
                 next
              end 

              eval(models[i] + ".create(#{csvPutIntoHash(line,csvColumns)})")

           end

           f.close
           db.commit
        rescue
           db.rollback
        end
     end
 end
4

1 に答える 1

4

IO#readlines配列を返します。つまり、ファイル全体を読み取り、すべての行のリストを返します。そのリストの繰り返しが完全に完了するまで、どの行もガベージ コレクションできません。

一度に 1 行しか必要ないため、IO#each_line代わりに を使用する必要があります。これにより、一度に少しだけ読み取られ、行が 1 行ずつ渡されます。行の処理が完了すると、残りのファイルが処理されている間にガベージ コレクションを実行できます。

最後に、Ruby には優れたCSV ライブラリがバンドルされていることに注意してください。可能であれば、自分で作成するのではなく、それを使用することをお勧めします。

于 2012-12-10T20:31:01.713 に答える