【问题标题】:R and shared memory for parallel::mclapplyR 和用于并行的共享内存::mclapply
【发布时间】:2012-12-06 04:53:58
【问题描述】:

我试图通过并行化在大约 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

我以为这样可以解决问题,但问题仍然存在。

还有其他想法吗?

【问题讨论】:

  • 总有办法投入更多的计算能力。就个人而言,我会尝试在EBI R-cloud 的一个免费集群实例上运行该作业。他们有很好的服务器,而且是免费的。看看你可以花时间修改并行函数,我认为值得一试。否则,启动具有大量 RAM 和 BioConductor AMI 的 Amazon 实例。
  • 任何运气整理或进一步理解它?我正在处理类似的事情,stackoverflow.com/q/20430773/210673
  • @Aaron 还没有进展,因为我最近不需要多核来进行计算。我可能不得不在几个月后重新审视这个问题。如果我发现任何新内容,我会确保更新帖子。
  • 谢谢!如果我取得任何进展,将在我链接到的帖子上注明。
  • @Aaron 这次是全新的数据集,我没有对大型全局变量做任何奇怪的事情,比如复制或修改,使用最新的 R 二进制文件并包含“Parallel”包,以及 mclapply,以及同样的行为仍然发生。

标签: macos r shared-memory


【解决方案1】:

Linux和macosx在fork时有copy-on-write机制,这意味着内存的页面实际上并没有被复制,而是在第一次写入之前共享。 mclapply 基于 fork(),因此(除非您写入大共享数据),您看到的进程列表报告的内存可能不是实际内存。

但是,在收集结果时,主进程必须为 mclapply 的每个返回结果分配内存。

为了进一步帮助您,我们需要更多地了解您的fun功能。

【讨论】:

    【解决方案2】:

    我想我会认为这不会因为写时复制功能而使用额外的内存。我认为列表的元素很大?也许当 R 将元素传递给 fun() 时,它实际上是在复制列表项,而不是在写入时使用复制。如果是这样,以下可能会更好:

    fun <- function(itemNumber){
      myitem <- lst[[itemNumber]]
      # now do your computations
    }
    res = rbind.fill(parallel::mclapply(1:length(lst), fun, mc.cores=3, mc.preschedule=T))
    

    或者直接在你的函数中使用lst[[itemNumber]]。如果 R/Linux/macos 不够聪明,无法在您编写函数时使用写时复制,则可以使用这种修改后的方法。

    编辑:我假设您没有修改列表中的项目。如果这样做,R 将复制数据。

    【讨论】:

      【解决方案3】:

      只是提示可能发生的事情 R-devel Digest, Vol 149, Issue 22

      Radford Neal 2015 年 7 月 26 日的回答:

      当 mclapply fork 启动一个新进程时,内存最初是 与父进程共享。但是,内存页必须是 每当任何一个进程写入它时复制。不幸的是,R 垃圾收集器写入每个对象以标记和取消标记它 完成了完整的垃圾收集,因此很可能每个 R 对象将在每个进程中重复,即使其中很多 实际上并没有改变(从 R 程序的角度来看)。

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。但无论如何,您的回答值得赞赏。谢谢你:)
      猜你喜欢
      • 2015-10-13
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 2014-10-01
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      相关资源
      最近更新 更多