R内存存储许多数据帧的有效方法?

R memory efficient way to store many data frames?

我正在将几个文件一起读取到一个数据帧列表中,以便能够将函数应用于组合数据,但是当我有太多数据帧时,我 运行 陷入内存分配问题("Error: R cannot allocate memory").

例如读取的数据帧数量可变,假设现在有 3 个数据帧:

x = data.frame(A=rnorm(100), B=rnorm(200))
y = data.frame(A=rnorm(30), B=rnorm(300))
z = data.frame(A=rnorm(20), B=rnorm(600))
listDF <- list(x,y,z)

错误:R 无法分配内存

我想知道这里是否有人知道 [数组或具有许多列的单个数据框] 是否是一种更有效的存储和操作数据框的方式。

数据框列表是一种非常实用的方法,因为我可以根据数据框的名称来操作数据中的许多列,在处理可变数量的数据框时这很方便。无论如何,如果您有任何 ideas/any 喜欢的方法,请分享它们:) 谢谢!

数据表是 R 中非常高效的数据结构,看看它们也许对您的情况有用。

您的示例和提到的 apply 系列函数表明数据框的结构是相同的,即它们都具有相同的列。

如果是这种情况并且数据总量(所有数据帧加在一起)仍然适合可用 RAM 那么解决方案可能是将所有数据打包成一个大 data.table 带有一个额外的 id 列。这可以通过函数 rbindlist:

来实现
library(data.table)
x <- data.table(A = rnorm(100), B = rnorm(200))
y <- data.table(A = rnorm(30), B = rnorm(300))
z <- data.table(A = rnorm(20), B = rnorm(600))
dt <- rbindlist(list(x, y, z), idcol = TRUE)
dt
      .id           A           B
   1:   1 -0.10981198 -0.55483251
   2:   1 -0.09501871 -0.39602767
   3:   1  2.07894635  0.09838722
   4:   1 -2.16227936  0.04620932
   5:   1 -0.85767886 -0.02500463
  ---                            
1096:   3  1.65858606 -1.10010088
1097:   3 -0.52939876 -0.09720765
1098:   3  0.59847826  0.78347801
1099:   3  0.02024844 -0.37545346
1100:   3 -1.44481850 -0.02598364

源自各个源数据帧的行 可以通过 .id 变量来区分。所有内存高效 data.table 操作都可以应用于所有行、选定行 (dt[.id == 1, some_function(A)]) 或分组 (dt[, another_function(B), by = .id])。

尽管 data.table 操作具有内存效率,但 RAM 可能仍然是一个限制因素。使用 tables() 函数监控所有创建的 data.table 对象的内存消耗:

tables()
     NAME  NROW NCOL MB COLS    KEY
[1,] dt   1,100    3  1 .id,A,B    
[2,] x      200    2  1 A,B        
[3,] y      300    2  1 A,B        
[4,] z      600    2  1 A,B        
Total: 4MB

并从内存中删除不再需要的对象

rm(x, y, z)
tables()
     NAME  NROW NCOL MB COLS    KEY
[1,] dt   1,100    3  1 .id,A,B    
Total: 1MB

此解决方案可能并不理想,因为它不是免费的,但 Revolution R Enterprise 旨在处理 R 中的大数据问题。它使用了 [=13= 的一些数据操作功能] 在 R 中对大数据进行更快的计算。有一个学习曲线,因为它有不同的功能来处理新的数据类型,但如果你正在处理大数据,那么加速是值得的。你只需要决定学习它的时间和产品的成本是否比一些更慢、更笨拙的解决方法对你更有价值。