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

时间:2016-08-29 21:12:45

标签: r memory storage data-manipulation

我正在将几个文件一起读入数据帧列表,以便能够将函数应用于组合数据,但是当我有太多数据帧时,我遇到内存分配问题("错误:R不能分配内存")。

e.g。读取可变数量的数据帧,现在说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无法分配内存

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-1)

DataTables是R中非常有效的数据结构,看看它们对你的情况有用。

答案 2 :(得分:-2)

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

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

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]操作具有内存效率,但RAM可能仍然是一个限制因素。使用data.table函数监视所有已创建的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