Ruby文件IO - 无法分配内存

时间:2012-12-10 01:09:06

标签: ruby-on-rails ruby rhomobile rhodes

以下是将记录插入设备数据库的方法。我有一个问题,我得到一个'未分配内存'错误。

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

共有10个型号,其中一个相当大,有108,000个记录。

执行此行时会发生错误(f.readlines()。每个执行|行|),但是在插入最大模型之后会发生错误。

内存是否被正在迭代的块释放?或者还有其他事情发生了吗?

非常感谢任何有关此事的帮助!

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

1 个答案:

答案 0 :(得分:4)

IO#readlines返回一个数组,即它读取整个文件并返回所有行的列表。在完成迭代该列表之前,不能对任何行进行垃圾回收。

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

最后,请注意Ruby捆绑了一个好的CSV library,你可能想要使用它,而不是自己滚动。