R中拆分的快速替代方案
我使用R中拆分的快速替代方案,r,split,pentaho,lapply,R,Split,Pentaho,Lapply,我使用split()对数据帧进行分区,以便使用parlappy()在每个分区上并行调用函数。数据帧有130万行和20列。我用两列进行拆分/分区,两列都是字符类型。看起来有~47K个唯一ID和~12K个唯一代码,但不是每个ID和代码对都匹配。由此产生的分区数约为250K。以下是split()行: system.time(pop_part <- split(pop, list(pop$ID, pop$code))) 我已经让split()。我可以单独按ID分割,这需要约10分钟。此外,R
split()
对数据帧进行分区,以便使用parlappy()
在每个分区上并行调用函数。数据帧有130万行和20列。我用两列进行拆分/分区,两列都是字符类型。看起来有~47K个唯一ID和~12K个唯一代码,但不是每个ID和代码对都匹配。由此产生的分区数约为250K。以下是split()
行:
system.time(pop_part <- split(pop, list(pop$ID, pop$code)))
我已经让split()。我可以单独按ID分割,这需要约10分钟。此外,R studio和工作线程消耗约6GB的RAM
我知道分区数量的原因是我在Pentaho Data Integration(PDI)中有相当于30秒的代码(对于整个程序,而不仅仅是“拆分”代码)。我不希望R有这样的表现,但在最坏的情况下可能在10-15分钟内完成
主要问题是:有没有更好的选择来代替拆分?我也用.parallel=TRUE
尝试了ddply()
,但它也运行了一个多小时,从未完成过。将索引拆分为pop
idx <- split(seq_len(nrow(pop)), list(pop$ID, pop$code))
因此,如果您的是,我想您的数据中有一些方面会减慢速度,例如,ID
和code
都是具有多个级别的因素,因此它们的完整交互作用,而不是数据集中出现的级别组合,都会被计算出来
> length(split(1:10, list(factor(1:10), factor(10:1))))
[1] 100
> length(split(1:10, paste(letters[1:10], letters[1:10], sep="-")))
[1] 10
或者你的内存不足
如果您在非Windows计算机上使用进程,请使用mclappy
而不是parlappy
(我猜是这样,因为您要求使用detectCores()
)
par_popSplit(x,f)是慢的,如果x是一个因子,f包含很多不同的元素
因此,如果快速,此代码:
system.time(split(seq_len(1300000), sample(250000, 1300000, TRUE)))
但是,这是非常缓慢的:
system.time(split(factor(seq_len(1300000)), sample(250000, 1300000, TRUE)))
这又快了,因为只有25个小组
system.time(split(factor(seq_len(1300000)), sample(25, 1300000, TRUE)))
谢谢,我试试看。哈,事实上,我最初编写了R代码,然后将其移植到PDI(我对R比PDI更有经验)。我运行了您发布的split()
代码,等待了将近一个小时,但始终没有完成。围绕split添加了一些额外的建议,应该需要一秒钟或更短的时间。也许一些因素也导致了func的速度变慢?这对我非常非常有帮助。很长一段时间以来,我一直在粘贴字符串的数据帧上盲目使用“拆分”,内存开销非常大(data.frames将RAM乘以4x+)。这使我能够在9核而不是2核上运行代码,非常感谢。
system.time(split(seq_len(1300000), sample(250000, 1300000, TRUE)))
system.time(split(factor(seq_len(1300000)), sample(250000, 1300000, TRUE)))
system.time(split(factor(seq_len(1300000)), sample(25, 1300000, TRUE)))