R中是不是有像bigmemory这样的包可以处理大型列表对象?

Posted

技术标签:

【中文标题】R中是不是有像bigmemory这样的包可以处理大型列表对象?【英文标题】:Is there a package like bigmemory in R that can deal with large list objects?R中是否有像bigmemory这样的包可以处理大型列表对象? 【发布时间】:2012-11-22 23:31:07 【问题描述】:

我知道 R 包 bigmemory 在处理大型矩阵和数据帧方面效果很好。但是,我想知道是否有任何软件包或任何方法可以有效地处理大型列表。

具体来说,我创建了一个列表,其中的元素是向量。我有一个 for 循环,在每次迭代期间,多个值被附加到该列表中的选定元素(向量)。起初,它运行得很快,但是当迭代超过 10000 次时,它会逐渐变慢(一次迭代大约需要一秒钟)。我将经历大约 70000 到 80000 次迭代,之后列表会变得非常大。

所以我只是想知道在 bigmemory 包中是否有类似 big.list 之类的东西作为 big.matrix 可以加快整个过程。

谢谢!

【问题讨论】:

为什么不使用 do.call(rbind, your_list) 将列表转换为矩阵并使用 bigmemory? 你说你在'追加'?如果您为此使用例如 c() 或 rbind(),那可能会导致您的速度和内存问题。请参阅,burns-stat.com/pages/Tutor/R_inferno.pdf,第 12 页的 Circle 2 生长对象。您能否举一个您的代码作用的最小示例? 【参考方案1】:

我不确定这是否是一个有用的答案,但您可以使用 filehash 包以交互方式处理磁盘上的列表。

例如,这里有一些代码创建一个磁盘数据库,将一个预先分配的空列表分配给数据库,然后运行一个函数(获取当前时间)来填充数据库中的列表。

# how many items in the list?
n <- 100000
# setup database on disk
dbCreate("testDB") 
db <- dbInit("testDB")
# preallocate vector in database
db$time <- vector("list", length = n)
# run function using disk object
for(i in 1:n) db$time[[i]] <- Sys.time()

在此过程中几乎没有使用 RAM,但是由于磁盘 I/O 持续不断,它非常慢(在我的某些测试中比在 RAM 中执行它慢两个数量级) .所以我不确定这种方法能否很好地回答如何加快处理大型对象的问题。

【讨论】:

【参考方案2】:

DSL 包可能会有所帮助。 DList 对象就像 R 列表的替代品一样。此外,它还提供了类似设施的分布式列表。

【讨论】:

以上是关于R中是不是有像bigmemory这样的包可以处理大型列表对象?的主要内容,如果未能解决你的问题,请参考以下文章

R bigmemory 不会读取大的 csv 文件

在 R 中处理大数据的有效方法

在 R 中计算大矩阵的零空间

具有非常大矩阵的 K 均值

在 R 中哪些包可以快速加载更大的数据

TabBarController 是不是有像 prepareForSegue 这样的拦截点?