Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.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
在windows上通过引用传递大型对象的R中的并行包_R_Performance_Memory_Parallel Processing - Fatal编程技术网

在windows上通过引用传递大型对象的R中的并行包

在windows上通过引用传递大型对象的R中的并行包,r,performance,memory,parallel-processing,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 } 我想知道

假设我的计算机上有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上可以工作得更好

这里有两个问题:

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

  • 与Linux不同,Windows没有“fork”系统调用

  • 如果您在Linux上,并且使用基于分叉的并行化后端(例如,
    parallel::makeForkCluster()
    ),则可以访问Worker中的数据集,而无需重新加载/复制它

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

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