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 中对大数据进行更快的计算。有一个学习曲线,因为它有不同的功能来处理新的数据类型,但如果你正在处理大数据,那么加速是值得的。你只需要决定学习它的时间和产品的成本是否比一些更慢、更笨拙的解决方法对你更有价值。
我正在将几个文件一起读取到一个数据帧列表中,以便能够将函数应用于组合数据,但是当我有太多数据帧时,我 运行 陷入内存分配问题("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 中对大数据进行更快的计算。有一个学习曲线,因为它有不同的功能来处理新的数据类型,但如果你正在处理大数据,那么加速是值得的。你只需要决定学习它的时间和产品的成本是否比一些更慢、更笨拙的解决方法对你更有价值。