Mat*_*Son 7 parallel-processing multithreading r data.table
我有超过 10 亿个观测值的大数据,我需要执行一些字符串操作,速度很慢。
我的代码很简单:
DT[, var := some_function(var2)]
Run Code Online (Sandbox Code Playgroud)
如果我没记错的话,data.table
在使用 调用时使用多线程by
,并且我正在尝试利用它来并行化此操作。为此,我可以创建一个临时石斑鱼变量,例如
DT[, grouper := .I %/% 100]
Run Code Online (Sandbox Code Playgroud)
并做
DT[, var := some_function(var2), by = grouper]
Run Code Online (Sandbox Code Playgroud)
我尝试使用小样本数据进行一些基准测试,但令人惊讶的是我没有看到性能改进。所以我的问题是:
data.table
与 一起使用时是否使用多线程by
?data.table
在这里使用多线程?仅供参考,当我导入 data.table 时,我发现我的一半核心启用了多线程,所以我猜这里不存在 openMP 问题。
我data.table
从data.table github得到了开发人员的答案。
总结如下:
查找变量组by
本身始终是并行的,但更重要的是,
如果函数j
是通用的(用户定义函数),那么就没有并行化。
j
如果函数经过(gforce) 优化,则on 上的操作会并行化(j 中的表达式仅包含函数min
, max
, mean
, median
, var
, sd
, sum
, prod
, first
, last
, head
, tail
)
因此,如果功能是通用的,建议手动进行并行操作j
,但它可能并不总是保证速度增益。参考
==解决方案==
就我而言,当我简单地使用时,DT[, var := some_function(var2)]
即使我的服务器有 1TB 内存,但数据占用了 200GB 内存,我还是遇到了矢量内存耗尽。
我曾经split(DT, by='grouper')
把我的工作data.table
分成几块,然后用来doFuture
foreach
%dopar%
完成这项工作。速度相当快。