我试图通过并行化在大约 1000 个项目的列表上执行的昂贵操作来利用四核机器。
我目前正在使用 R 的 parallel::mclapply 函数:
res = rbind.fill(parallel::mclapply(lst, fun, mc.cores=3, mc.preschedule=T))
哪个有效。问题是,任何额外的子进程都必须分配一大块内存:
理想情况下,我希望每个核心都能从父 R 进程访问共享内存,这样当我增加 mclapply 中使用的核心数量时,我不会在核心限制之前达到 RAM 限制。
我目前不知道如何调试这个问题。每个进程访问的所有大型数据结构都是全局的(当前)。这是某种程度上的问题吗?
我确实将操作系统的共享内存最大设置增加到 20 GB(可用 RAM):
$ cat /etc/sysctl.conf
kern.sysv.shmmax=21474836480
kern.sysv.shmall=5242880
kern.sysv.shmmin=1
kern.sysv.shmmni=32
kern.sysv.shmseg=8
kern.maxprocperuid=512
kern.maxproc=2048
我认为这会解决问题,但问题仍然存在。
还有其他想法吗?