r - R 中的并行包在 Windows 上通过引用传递大对象

标签 r performance memory parallel-processing

假设我的计算机上有 8 个核心。我已经在 RAM 上加载了一个 2Go 数据集,我希望这些工作人员中的每一位都只从该数据集中读取我所做的事情:

worker.function(rowstoread, dataset)
{
  #read a couple of rows from the dataset (those rows are sent as argument to the  worker function)
  #process these rows
  #return results
}

我想知道为什么这会在每个工作人员级别产生数据集的副本,因为我的工作人员仅从数据集中读取数据。他们没有修改数据集中的任何内容。

是否有任何解决办法或者这是 R 固有的?如果我改用 Linux 机器,这个问题是否会得到缓解,或者数据集的副本仍然会出现在每个工作人员的级别?

最佳答案

TL;DR:这可以在 Linux 上工作得更好。

这里有两个问题:

  1. R 是单线程的,只知道进程级别的并行性。

  2. 与 Linux 不同,Windows 没有“fork”系统调用。

如果您使用的是 Linux 并且使用基于 fork 的并行化后端(例如 parallel::makeForkCluster()),您可能能够访问以下位置的数据集:工作人员无需重新加载/复制它。

单线程

现代操作系统支持每个进程多个线程,所有线程都可以访问相同的数据。进程中的所有线程必须确保并发数据访问始终使内存处于一致状态,即使多个线程更新同一位置也是如此。这通常是通过锁定机制来完成的,但实现起来也很重要。 R 的某些部分(例如,如果我没记错的话,内存分配器)本质上是单线程的,因此所有(解释的)R 代码都必须是单线程的。与 R 并行工作的唯一方法是生成多个进程。

fork

Windows 上的每个新进程都以“空”启动,并且必须从外部存储加载其代码和数据。另一方面,Linux 有一个“fork”系统调用,它允许创建第二个进程,该进程以与正在运行的进程完全相同的内存内容(代码和数据)启动。

关于r - R 中的并行包在 Windows 上通过引用传递大对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38955405/

相关文章:

memory - 字可寻址和字节可寻址的区别

R:列出所有无方向的圆形排列/排列(即顺时针/逆时针相同)

r - 在 R 中分配数字并汇总滑动窗口中的计数

r - 在 R 中对数据框进行排序(基于列值)

php - mysql选择两个表并使用 "or"变得非常慢

c++ - cuda 共享内存 - 结果不一致

r - 如何简化R中的角度(以度为单位)?

javascript - 数羊(Beatrix Trotter)Javascript

.net - ASP.NET 衡量性能

python - 如何强制释放字典使用的内存?