【问题标题】:Strange memory use in dplyr mutate using pastedplyr 中的奇怪内存使用使用 paste 变异
【发布时间】:2018-06-19 13:55:09
【问题描述】:

所以我的实际数据集是 1600 万行并且是机密的,但我可以很容易地说明正在发生的事情。我根本不理解这种行为,它与我所读过的所有内容背道而驰,或者至少我认为是这样。

所以这是一个数据框,带有字符串和日期(真正的有更多的列和更多的行)

library(tidyverse)

test = data.frame("a" = letters, 
                  "b" = seq.Date(as.Date("2018-01-01"), 
                                 as.Date("2018-01-26"), "days")
)

我想制作第三列,将前两列粘贴在一起。我是这样做的:

finalTest = test %>%
  mutate(c = paste(a, b))

如果我这样做,有 1600 万行,它会从大约 2GB 的 RAM 变为近 8GB,并且进程被服务器杀死(它有 8GB 的​​ RAM)。

但是,如果我将数据集一分为二,粘贴列,然后 rbind,这很好,即使这样做我创建了不必要的对象(整个数据集只有大约 700MB,所以它确实有意义对象适合 RAM)。

test1 = test %>%
  filter(row_number() <= floor(n()/2)) %>%
  mutate(c = paste(a, b))

test2 = test %>%
  filter(row_number() > floor(n()/2)) %>%
  mutate(c = paste(a, b))

finalTest2 = rbind(test1, test2)

这很好。对象似乎适合内存,但在您对它们进行操作时却不适合。但是发生了这么大的内存占用?

我完全不明白。这是预期的行为吗?粘贴是独一无二的吗?粘贴字符串和日期?还有什么?

【问题讨论】:

  • 粘贴分配两次,因此对于较长的输入来说很昂贵

标签: r dplyr


【解决方案1】:

我也经历过...如果您的数据帧中开始有 16M 行,我建议您不要费心使用 dplyr 优化内存使用,只需使用 data.table。速度更快,内存效率更高,虽然语法复杂,但有一些解决方法(如下)。 请确保您了解 data.table 内存管理通常是通过引用而不像 dplyr 复制副本(这是性能差异的原因)。
由于 data.table 的语法很难恕我直言,并且一开始可能有点困难,您可以使用 dtplyr 包将您的 dplyr 代码转换为 data.table (使用 show_query 函数)或查看此网页: https://atrebas.github.io/post/2019-03-03-datatable-dplyr/ 我发现它对于熟悉 dplyr 但不熟悉 data.table 的人非常有用。

如果您真的想坚持使用 dplyr,请确保您使用的 data.frame 之前没有在代码中的某个位置分组,如果您忘记了它,这有时会涉及令人惊讶的行为(使用 ungroup())。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2020-08-06
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    相关资源
    最近更新 更多