【问题标题】:Exceeding memory limit in R (even with 24GB RAM)超过 R 中的内存限制(即使使用 24GB RAM)
【发布时间】:2023-03-15 19:56:01
【问题描述】:

我正在尝试合并两个数据框:一个有 33 个变量的 908450 个观察值,另一个有 2 个变量的 908450 个观察值。

dataframe2 <-merge(dataframe1, dataframe2, by="id")

我已经从工作内存中清除了所有其他数据帧,并使用以下代码重置了我的内存限制(对于具有 24 GB RAM 的全新桌面):

memory.limit(24576)

但是,我仍然收到错误 Cannot allocate vector of size 173.Mb

关于如何解决这个问题的任何想法?

【问题讨论】:

  • package data.table 可以比data.frames 更节省内存并且速度更快,因为它生成的数据副本更少。
  • 您实际使用的是 24 Gb,以及相关的,您的操作系统是 64 位吗?
  • 操作系统必须能够为 R 分配所需数量的连续内存。因此您可能会受到正在运行的其他应用程序的限制。
  • @詹姆斯宾果。请注意,这不是 R 特有的问题,因为 Stata 文档建议在尝试大合并之前重新启动计算机。也就是说,data.table 绝对是获得这么大数据集的方法。

标签: r memory memory-management dataframe


【解决方案1】:

要跟进我的 cmets,请使用 data.table。我整理了一个与您的数据相匹配的快速示例来说明:

library(data.table)

dt1 <- data.table(id = 1:908450, matrix(rnorm(908450*32), ncol = 32))
dt2 <- data.table(id = 1:908450, rnorm(908450))
#set keys
setkey(dt1, id)
setkey(dt2, id)
#check dims
> dim(dt1)
[1] 908450     33
> dim(dt2)
[1] 908450      2
#merge together and check system time:
> system.time(dt3 <- dt1[dt2])
   user  system elapsed 
   0.43    0.03    0.47 

所以合并在一起用了不到 1/2 秒。我拍了一张前后截图,看着我的记忆。在合并之前,我使用的是 3.4 gigs 的 ram。当我合并在一起时,它跃升至 3.7 并趋于平稳。我认为您将很难找到比这更节省内存或时间的东西。

之前:

之后:

【讨论】:

  • 您好——快速提问。我使用dat1_table&lt;-data.table(data1)dat2_table&lt;-data.table(data2) 将我的两个数据框都更改为数据表。但是,当我尝试设置密钥时,我收到错误Column 2 is length 9 which differs from length of column 1。但是,使用dim() 时行数似乎相同。
  • @roody - 这很奇怪。我刚刚使用上面的示例进行了测试,首先将它们制作为 data.frames,然后使用您的方法转换为 data.tables。我无法重现该错误。你确定data1data2 实际上是data.frames 吗?您可以通过class()str()is.data.frame() 进行检查。您也可以尝试在一个命令中创建 data.table 时设置密钥,即dt &lt;- data.table(yourDF, key = "yourKey")
  • 嗨,Chase——显然,其中一个数据集中的日期时间变量搞砸了。这一切都奏效了!非常感谢!
  • @roody - 很酷,很高兴你成功了。这是data.table 的一些很好的背景。它有一点学习曲线,但是一旦你爬上曲线——它很快就会对大数据任务变得无价之宝。这里也有很多关于 SO 的好资源。
【解决方案2】:

我能想到的解决办法有以下三种:

  • 使用数据表
  • 使用交换内存(可以在 *nix 机器上调整)
  • 使用抽样

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-12
    • 2012-10-23
    • 1970-01-01
    • 2012-11-11
    • 2021-10-12
    • 2012-09-16
    • 2019-11-09
    • 2014-12-17
    相关资源
    最近更新 更多