内存分配的解决方法

时间:2017-12-06 15:47:38

标签: r memory-management

我在这里读了很多关于内存管理的问题。所以我清理了我的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上还是将其转换为矩阵会增加大小?

1 个答案:

答案 0 :(得分:2)

@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)