【问题标题】:Big Merge / Memory management大合并/内存管理
【发布时间】:2011-12-21 19:59:40
【问题描述】:

我在尝试合并一个大文件和一个小文件时遇到了困难。我有readmany 其他关于 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. 我需要能够merge 来创建更大的对象。
  2. 然后我需要对那个更大的对象进行回归等。

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

非常感谢任何指导。

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

【问题讨论】:

  • 你看过data.table包吗?对于大型合并,它,巧合的是,启动时内存效率可能更高?
  • 这可能无法解决您的问题,但您可以尝试以下方法。如果任一数据集中有您不需要的列:在读入数据后将其删除,执行 gc(),然后再次尝试合并。另一个想法是尽可能将您的数据转换为矩阵,因为它们往往会占用更少的内存。

标签: r memory-management merge data.table


【解决方案1】:

正如 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 路线,look at example 4i on its website ...,请确保您正确使用索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-11
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    相关资源
    最近更新 更多