Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数以千计的连续联接需要在R中执行_R_Performance_Join - Fatal编程技术网

数以千计的连续联接需要在R中执行

数以千计的连续联接需要在R中执行,r,performance,join,R,Performance,Join,我需要以最快的方式执行大约数千次左连接,因为我想重复数千次。执行大约1000次连接需要大约60秒。我对此不满意。有人知道我该如何加速计算吗 所以我得到了一个data.frame列表,我想通过key id_客户机与data.table连接table0是一个data.table。数据帧列表的元素是数据帧 这是我的密码: setkey(table0,id_client) for (i in seq(1,length(list_of_dataframe))){ table0=merge(table0,s

我需要以最快的方式执行大约数千次左连接,因为我想重复数千次。执行大约1000次连接需要大约60秒。我对此不满意。有人知道我该如何加速计算吗

所以我得到了一个data.frame列表,我想通过key id_客户机与data.table连接table0是一个data.table。数据帧列表的元素是数据帧

这是我的密码:

setkey(table0,id_client)
for (i in seq(1,length(list_of_dataframe))){
table0=merge(table0,setkey(setDT(list_of_dataframe[[i]]),id_client),
             all.x=TRUE,by.x="id_client",by.y="id_client")
  }

如果整个集合都可以放入内存,那么最好将数据帧的列表串联起来,然后只进行一次合并

这段代码只设置了1000个数据帧的列表,每个数据帧有2250行:

library(pacman)
p_负载(data.table、foreach、tictoc)
size.df=2250
num.df=1000
foreach(i=seq(1,size.df*num.df,size.df))%do%{
数据帧(id_unique=i:(i+size.df-1),
id_client=sample(i:(i+size.df-1),size.df,replace=TRUE),
值=rnorm(size.df))
}->数据帧的列表
table0=data.table(id\u client=1:(size.df*num.df))
这是连接和合并,在我的机器上大约需要12秒:

tic() >合并(表0,do.call('rbind',数据帧列表), all.x=TRUE,by='id\u client')->result >toc() 12.178秒过去了 请注意,添加了一个唯一id列以允许非唯一id_客户端。你必须以某种方式来处理这件事。如果希望将重复项作为列而不是行,则可以根据需要重塑形状

>头部(结果)
id\u客户端id\u唯一值
1:         1       725 -0.8468212
2:2娜娜
3:         3      1066 -0.1352698
4:         3      1906 -0.5246030
5:4娜娜
6:         5      1732 -0.1328604

如果不可能将所有内容都放入内存,那么可以使用带有
foreach
.combine/.multicombine
来处理和合并块(可能是并行的)。

如果整个集合都可以放入内存,最好将数据帧的
列表串联起来,然后只进行一次合并

这段代码只设置了1000个数据帧的列表,每个数据帧有2250行:

library(pacman)
p_负载(data.table、foreach、tictoc)
size.df=2250
num.df=1000
foreach(i=seq(1,size.df*num.df,size.df))%do%{
数据帧(id_unique=i:(i+size.df-1),
id_client=sample(i:(i+size.df-1),size.df,replace=TRUE),
值=rnorm(size.df))
}->数据帧的列表
table0=data.table(id\u client=1:(size.df*num.df))
这是连接和合并,在我的机器上大约需要12秒:

tic() >合并(表0,do.call('rbind',数据帧列表), all.x=TRUE,by='id\u client')->result >toc() 12.178秒过去了
请注意,添加了一个唯一id列以允许非唯一id_客户端。你必须以某种方式来处理这件事。如果希望将重复项作为列而不是行,则可以根据需要重塑形状

>头部(结果)
id\u客户端id\u唯一值
1:         1       725 -0.8468212
2:2娜娜
3:         3      1066 -0.1352698
4:         3      1906 -0.5246030
5:4娜娜
6:         5      1732 -0.1328604

如果无法将所有内容都放入内存中,则可以使用带有
foreach
来处理和合并块(可能是并行的)。

处理多少行?在这个循环中,您都设置了关键点和连接,连接占用了多少时间?在您的用例中,可以在连接之前设置键吗?不是很多行,在500到5000之间。我要测试你的建议你想在数百万行上进行一次连接,而不是在数千行上进行数千次连接?你要处理多少行?在这个循环中,您都设置了关键点和连接,连接占用了多少时间?在您的用例中,可以在连接之前设置键吗?不是很多行,在500到5000之间。我要测试你的建议你想在数百万行上进行一次连接,而不是在数千行上进行数千次连接?