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