大合并/内存管理

Dan*_*gan 6 merge memory-management r data.table

我试图合并一个大文件和一个较小的文件.我在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
Run Code Online (Sandbox Code Playgroud)

我想我在问这有什么巧妙的方法不涉及购买新硬件吗?

  1. 我需要能够merge创建一个更大的对象.
  2. 然后我需要对那个更大的对象进行回归等.

我应该放弃吗?bigmemory应该能够帮助解决这个问题吗?

任何指导都非常感谢.

详细信息:R版本2.13.1(2011-07-08)平台:i386-pc-mingw32/i386(32位)Intel 2 Duo Core @ 2.33GHz,3.48GB RAM

Ste*_*lou 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]
Run Code Online (Sandbox Code Playgroud)

如果你去sqldf路线,请查看其网站上的示例4i ...再次确保正确使用索引.