使用 data.table 并行化/多线程

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)

我尝试使用小样本数据进行一些基准测试,但令人惊讶的是我没有看到性能改进。所以我的问题是:

  1. data.table与 一起使用时是否使用多线程by
  2. 如果是这样,是否存在启用/禁用多线程的条件?
  3. 有没有一种方法可以让用户“强制”data.table在这里使用多线程?

仅供参考,当我导入 data.table 时,我发现我的一半核心启用了多线程,所以我猜这里不存在 openMP 问题。

Mat*_*Son 3

data.tabledata.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%完成这项工作。速度相当快。