我有一个脚本,通过使用循环逐行插入数据来创建数据表。插入是使用rbindlist()
完成的。这种方法似乎变化很大,因为似乎在每次迭代中我的数据表dt
都被重新分配:
tracemem(dt)
[1] "<0x2bd3d00>"
tracemem(dt <- rbindlist(list(dt, newrow)))
[1] "<0x44a7fe0>"
这篇question中的一些旧评论(约3年)提到了一个
insert()
方法,但我没有在这方面找到任何更新。有没有内存有效的方法来做到这一点?
答案 0 :(得分:4)
你正在循环中增长一个对象。当然,这很慢,无论是data.table都没关系。
data.table如此高效的秘诀之一是它过度分配,即为其创建期间不存在的列保留内存。你需要为行做类似的事情。在循环中创建您将需要的空行的全部数量,立即将它们绑定到data.table并在循环中通过赋值填充它们,最好使用set
。