【发布时间】:2017-12-06 22:19:33
【问题描述】:
这是我的previous question 的后续问题。我遇到了一个问题,要找到一种内存高效的解决方案,以便为我的大型数据集(350 万组和 620 万人)找到共同的三分之一
使用igraph 包的建议解决方案对于正常大小的数据集运行速度很快,不幸的是,由于为更大的数据集创建了一个大矩阵,因此遇到了内存问题。类似的问题出现在我自己的使用串联内连接的解决方案中,其中第三个内连接使数据帧膨胀,因此我的电脑内存不足 (16gb)。
df.output <- inner_join(df,df, by='group' ) %>%
inner_join(.,df, by=c('person.y'='person')) %>%
inner_join(.,df, by=c('group.y'='group')) %>%
rename(person_in_common='person.y', pers1='person.x',pers2='person') %>%
select(pers1,pers2,person_in_common) %>%
filter(pers1!=pers2) %>%
distinct() %>%
filter(person_in_common!=pers1 & person_in_common!=pers2)
df.output[-3] <- t(apply(df.output[-3], 1,
FUN=function(x) sort(x, decreasing=FALSE)))
df.output <- unique(df.output)
小数据集示例和预期输出
df <- data.frame(group= c("a","a","b","b","b","c"),
person = c("Tom","Jerry","Tom","Anna","Sam","Nic"), stringsAsFactors = FALSE)
df
group person
1 a Tom
2 a Jerry
3 b Tom
4 b Anna
5 b Sam
6 c Nic
预期结果
df.output
pers1 pers2 person_in_common
1 Anna Jerry Tom
2 Jerry Sam Tom
3 Sam Tom Anna
4 Anna Tom Sam
6 Anna Sam Tom
不幸的是,我无法使用具有更多内存的机器,也没有真正的云计算经验,所以我希望让它在我的本地电脑上运行。我将不胜感激输入如何优化任何解决方案或建议如何以其他方式解决问题。
编辑 1
反映我实际数据大小的数据框。
set.seed(33)
Data <- data.frame(group = sample(1:3700000, 14000000, replace=TRUE),
person = sample(1:6800000, 14000000,replace = TRUE))
编辑 2
作为示例数据,就更大的组和每组更多的人而言,我的真实数据要复杂一些。因此,它变得更加记忆密集。我不知道如何模拟这种结构,所以请按照真实数据下载:
【问题讨论】:
-
我不明白你是如何选择共同的人的。
-
你能给出创建你想要处理的大小的示例数据的代码吗?
-
第一次加入(
inner_join(df,df, by='group'))你能做到吗? -
@minem,抱歉回复晚了。我可以运行第一个和第二个连接,它与第三个连接崩溃。我会尽快用我的真实数据的实际尺寸设置一个测试数据框
-
@F.Privé 我不确定如何比输出示例更清楚地解释它。基本上,当你有至少三个人时,你可以在一个组内有一个共同的第三个,当你们两个人共享一个第三个时,你可以跨组。
标签: r optimization bigdata