【问题标题】:Workaround for memory allocation内存分配的解决方法
【发布时间】:2018-05-20 13:39:45
【问题描述】:

我在这里阅读了很多关于内存管理的问题。所以我清理了我的 GB 大小的数据并将其缩小到 32MB(770K 行)并将其存储在 BigQuery 上。但是当我尝试把它变成矩阵时,as.data.frame(str_split_fixed(event_list$event_list, ",", max(length(strsplit(event_list$event_list, ","))))),我得到了这个错误

错误:无法分配大小为 4472.6 Gb 的向量

无论如何要解决这个问题,我在这里做错了什么?是我将其存储在 BigQuery 上还是将其转换为矩阵会增加大小?

【问题讨论】:

  • 难道不是您的 str_split 正在生成大量数据。检查as.data.frame(event_list)是否先工作
  • event_list$event_list 的长度是多少?因为您正在尝试创建一个包含那么多列的 data.frame。
  • @Emmanuel-Lin 这部分是可行的
  • @NathanWerth 70 万行 10 列
  • 也许我在这里遗漏了一些东西,但看起来你有很多冗余。不知道为什么要调用max(length(etc.,因为长度返回一个整数。我想你可能会选择lengths(带有“s”)。此外,strsplitstr_split_fixed 非常相似。理论上你可以从strsplit 得到str_split_fixed 的结果。如果你必须计算不止一次,特别是如果它是一个昂贵的操作,你应该只计算一次并将它存储在一个变量中。继续...

标签: r memory-management


【解决方案1】:

@JosephWood 做到了。如果 event_list 有 700,000 行,那么您正在尝试创建一个有 700,000 行和 700,000 列的 data.framestrsplit(event_list$event_list, ",") 将是一个长度为 700,000 的列表,因此 length(strsplit(event_list$event_list, ",")) 给出了一个数字:700000。一个数字的max 就是那个数字。你应该改用lengths

所以你对str_split_fixed 的调用最终会是这样的:

str_split_fixed(event_list$event_list, ",", n = 700000)

这给出了一个包含 700,000 个元素(长度为 event_list$event_list)的列表,每个元素都是一个具有 700,000 个值 (n) 的字符向量。

在我的机器上,我粗略估计了必要的内存:

format(700000 * object.size(character(700000)), "GB")
# [1] "3650.8 Gb"

这还不包括将这些向量存储在data.frame 中所需的任何额外内存。

解决办法:

split_values <- strsplit(event_list$event_list, ",")
value_counts <- lengths(split_values)
extra_blanks <- lapply(max(value_counts) - value_counts, character)
values_with_blanks <- mapply(split_values, extra_blanks, FUN = c, SIMPLIFY = FALSE)
DF <- as.data.frame(values_with_blanks)

【讨论】:

  • 很好的插图...尤其是内存估计。这是经常被忽视的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
相关资源
最近更新 更多