【问题标题】:R cannot allocate vector when merging data framesR在合并数据帧时无法分配向量
【发布时间】:2017-01-18 13:11:47
【问题描述】:

我正在尝试合并两个数据帧 A 和 B。根据object_size(),A 大约有 45,000 行和 25 列,大小为 7.39 MB。 B 有大约 122,000 行和 36 列,尽管合并中只涉及 2 列。 B 大小为 32.6 MB。这是我的合并代码:

A <- merge(x=A, y=B[,c("col1","col2")], by="col1", all.x=TRUE, all.y=FALSE)

当我尝试运行合并时:我收到以下错误消息:

Error: cannot allocate vector of size 6.6 Gb
In addition: Warning messages:
1: In merge.data.frame(x = bat.2007.2014, y = mlb.ebis.keys[, c("player_id",  :
  Reached total allocation of 12186Mb: see help(memory.size)
2: In merge.data.frame(x = bat.2007.2014, y = mlb.ebis.keys[, c("player_id",  :
  Reached total allocation of 12186Mb: see help(memory.size)
3: In merge.data.frame(x = bat.2007.2014, y = mlb.ebis.keys[, c("player_id",  :
  Reached total allocation of 12186Mb: see help(memory.size)
4: In merge.data.frame(x = bat.2007.2014, y = mlb.ebis.keys[, c("player_id",  :
  Reached total allocation of 12186Mb: see help(memory.size)

我运行的是 Windows 10 和 R 版本 3.3.1(64 位)。我的机器有 12 GB 的 RAM。

这两个数据框的大小似乎都适中。为什么我的内存不足?

【问题讨论】:

  • 6.6GB 相当大。您已经在 R 会话中使用了 RAM,R 本身使用 RAM,Windows 使用 RAM,其他程序使用 RAM,等等。因此,只有 12 GB 的总 RAM,6.6 GB 的向量太大也就不足为奇了。问题很可能出在联接上。也许您正在创建许多行副本。例如col1 不是一个唯一键,它在每个数据集中标识每条记录一次且仅一次,而是描述多行,那么您将使用merge 创建一个指数级更大的数据集。
  • length(unique(A$col1))length(unique(B$col1)) 是什么? merge 完成的连接是“笛卡尔”。
  • @42- col1 的唯一长度分别为 2024 和 73,216。 A 有 36,425 行,其中 col1 为 NA。
  • 如果你在连接的两边有很多复制的键值,匹配的数量会成倍增加。 (“笛卡尔积”的含义。)
  • 谢谢,这很有帮助。我正在努力删除重复的键,合并进展顺利。

标签: r memory merge


【解决方案1】:

检查要合并的列名是否完全匹配。我有一个类似的问题,很可能是内存分配异常的原因。是的,主要的应该始终是唯一的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2023-03-05
    • 2018-03-25
    相关资源
    最近更新 更多