在windows上通过引用传递大型对象的R中的并行包
假设我的计算机上有8个核。我已经在RAM上加载了一个2Go数据集,我希望这些工作人员中的每一个人都只从该数据集中读取我的操作:在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 } 我想知道
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上可以工作得更好 这里有两个问题:
parallel::makeForkCluster()
),则可以访问Worker中的数据集,而无需重新加载/复制它
单线性
现代操作系统支持每个进程有多个线程,所有线程都可以访问相同的数据。进程中的所有线程必须确保并发数据访问始终使内存保持一致状态,即使多个线程更新同一位置也是如此。这通常是通过锁定机制来实现的,但实现起来也非常困难。R的某些部分(例如,如果我没记错的话,内存分配器)本质上是单线程的,因此必须是所有(解释的)R代码。与R并行工作的唯一方法是生成多个进程
分叉
Windows上的每个新进程都以“空”启动,并且必须从外部存储器加载其代码和数据。另一方面,Linux有一个“fork”系统调用,它允许创建第二个进程,该进程以与正在运行的进程完全相同的内存内容(代码和数据)开始