以下是将记录插入设备数据库的方法。我有一个问题,我得到一个'未分配内存'错误。
它在内存非常有限的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
答案 0 :(得分:4)
IO#readlines
返回一个数组,即它读取整个文件并返回所有行的列表。在完成迭代该列表之前,不能对任何行进行垃圾回收。
由于您一次只需要一行,因此应使用IO#each_line
代替。这将一次只读一点,然后逐行传递。完成一行后,可以在处理文件的其余部分时对其进行垃圾回收。
最后,请注意Ruby捆绑了一个好的CSV library,你可能想要使用它,而不是自己滚动。