1

下面是一种将记录插入设备数据库的方法。我遇到了“分配内存失败”错误的问题。

它在内存非常有限的 Windows Mobile 设备上运行。

有 10 个模型,其中一个相当大,有 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返回一个数组,即它读取整个文件并返回所有行的列表。在您完全完成对该列表的迭代之前,不会对任何行进行垃圾收集。

由于您一次只需要一行,因此您应该使用IO#each_line。这将一次只读取一点点,并逐行传递给您。完成一行后,可以在处理文件的其余部分时对其进行垃圾收集。

最后,请注意 Ruby 捆绑了一个很好的CSV 库,如果可以的话,您可能想使用它而不是自己动手。

于 2012-12-10T20:31:01.713 回答