【发布时间】: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。 -
如果你在连接的两边有很多复制的键值,匹配的数量会成倍增加。 (“笛卡尔积”的含义。)
-
谢谢,这很有帮助。我正在努力删除重复的键,合并进展顺利。