我在这里读了很多关于内存管理的问题。所以我清理了我的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上还是将其转换为矩阵会增加大小?
答案 0 :(得分:2)
@JosephWood钉了它。如果event_list
有700,000行,那么您尝试创建一个包含700,000行和700,000列的data.frame
。 strsplit(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)