大型合并 / 内存管理

6
我正在尝试合并一个大文件和一个小文件,但卡住了。我阅读了许多有关R内存管理的文章(点击此处) (点击此处),但没有找到非极端的解决方法(如转为64位,上传到集群等)。我尝试使用bigmemory包,但未能找到解决方案。在我绝望之前,我想在这里尝试一下。 我运行的代码类似于以下内容:
#rm(list=ls())
localtempdir<- "F:/Temp/"
memory.limit(size=4095)
[1] 4095
    memory.size(max=TRUE)
[1] 487.56
gc()
         used (Mb) gc trigger  (Mb) max used  (Mb)
Ncells 170485  4.6     350000   9.4   350000   9.4
Vcells 102975  0.8   52633376 401.6 62529185 477.1

client_daily<-read.csv(paste(localtempdir,"client_daily.csv",sep=""),header=TRUE)
object.size(client_daily)
>130MB

sbp_demos<-read.csv(paste(localtempdir,"sbp_demos",sep=""))
object.size(demos)
>0.16MB
client_daily<-merge(client_daily,sbp_demos,by.x="OBID",by.y="OBID",all.x=TRUE)
Error: cannot allocate vector of size 5.0 MB

我想问一下,是否有任何聪明的方法可以解决这个问题,而不需要购买新的硬件?
  1. 我需要能够合并以创建更大的对象。
  2. 然后我将需要对该更大的对象进行回归等操作。
我应该放弃吗?bigmemory能帮助解决这个问题吗?
非常感谢任何指导。
详情:R版本2.13.1(2011-07-08)平台:i386-pc-mingw32 / i386(32位)Intel 2 Duo Core @ 2.33GHz,3.48GB RAM

4
你看过data.table包吗?对于大型合并,它非常快速,并且巧合的是可能更加内存高效? - Chase
这可能不会解决你的问题,但你可以尝试一下。如果数据集中有任何你不需要的列:在读入数据后将它们删除,执行gc(),然后再尝试合并。另一个想法是,如果可能的话,将你的数据转换为矩阵,因为它们往往使用更少的内存。 - Rguy
1个回答

8

正如Chase所提到的,你可以尝试使用data.table或者sqldf

对于任意一种方法,如果你能适当地设置索引,就能够更好地发挥它们的作用。

使用data.table时,你需要:

dt1 <- data.table(sbp_demos, key='OBID')
dt2 <- data.table(client_daily, key='OBID')

## Do an INNER JOIN-like operation, where non-matching rows are removed
mi <- dt1[dt2, nomatch=0]

## Do a RIGHT JOIN(?)-like operation ... all rows in dt2 will be returned.
## If there is no matching row in dt1, the values in the dt1 columns for
## the merged row will be NA
mr <- dt1[dt2]

如果你选择使用sqldf,请查看它网站上的例子4i(http://code.google.com/p/sqldf/)...同样地,请确保正确使用索引。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接