R 如何将行更改分配给';应用';来自并行包的函数

R 如何将行更改分配给';应用';来自并行包的函数,r,matrix,parallel-processing,assign,mclapply,R,Matrix,Parallel Processing,Assign,Mclapply,在R中,可以使用,使用 库(未来) 计划(多进程) m您不能并行分配,因为您只是分配给矩阵的本地副本 两种解决方案: 使用共享内存(例如,使用包{bigstatsr}的磁盘上的矩阵;免责声明:我是作者) 首先不要分配。只需运行lappy(),将所有结果部分作为一个列表,并使用do.call(“rbind”,list) 我敢肯定,在并行的情况下,你不能进行这种就地赋值。试图同时修改多个进程中的一个对象似乎是相当危险的。所有的操作都必须在不同的行上吗?两个进程试图访问相同的值时是否会发生冲突?(在你

在R中,可以使用
,使用

库(未来)
计划(多进程)

m您不能并行分配,因为您只是分配给矩阵的本地副本

两种解决方案:

  • 使用共享内存(例如,使用包{bigstatsr}的磁盘上的矩阵;免责声明:我是作者)

  • 首先不要分配。只需运行
    lappy()
    ,将所有结果部分作为一个列表,并使用
    do.call(“rbind”,list)


  • 我敢肯定,在并行的情况下,你不能进行这种就地赋值。试图同时修改多个进程中的一个对象似乎是相当危险的。所有的操作都必须在不同的行上吗?两个进程试图访问相同的值时是否会发生冲突?(在你的日常使用中,不是你的例子)@Axeman这就是我害怕的。。。但我更喜欢先问,因为即使并行执行,它也会指向特定的行。@Gallarus我看不出您所想的那种碰撞。我假设并行处理矩阵的行,实际上会以某种方式“分割”任务,使其始终特定于要替换的行集。矩阵的结构(行数和列数)不变。只有内容发生了更改。@YoannPageaud在您的示例中是。我想知道你是否设想有可能将你的方法扩展到可能发生这种情况的更一般的问题。因为现在你的例子并不能证明所有这些复杂性,所以我想你有更详细的想法。是的,我也考虑过使用未来的软件包。这将是一个好主意。问题是,我目前正在开发一个包,并试图尽可能减少依赖项的数量,以保持其“轻”:目前我使用并行包作为依赖项之一,因此,如果我可以依赖一个唯一的包来处理所有并行内容,那就更好了。但如果没有这一约束,未来的选择将完全符合问题。一旦我发布了我的包,我肯定会考虑使用未来,而不是并行在下一个版本。使用<代码>未来< /代码>有附加价值,使您的包并行工作容易在多个OSES。而且它本身的依赖性也很低。但我理解你的担忧。我会再等几天,以防万一,我想我会接受不可能并行分配的事实。你的包裹看起来很有趣,我会记住:速度方面怎么样?您是否做过一些基准测试来比较您的函数与RAM中的矩阵相比花费了多少时间?我想知道在运行
    do.call()
    之前将结果保存在列表中是否比将值保存在矩阵中更容易占用内存。与并行执行的实际计算相比,分配给矩阵不会花费太多时间。如果有一个列表,那么矩阵将需要两倍的内存。您的软件包是否考虑到使用的“磁盘”类型(使用SSD工作吗?我应该使用SSD还是HDD)?我认为我们应该保持联系:我目前正在使用ggplot2开发一个基因组可视化软件包,我认为磁盘上矩阵的想法也与我的工作相关,可能会为我的软件包增加价值。我在操作矩阵时也遇到了一些困难(因为整形2已被弃用,我不想移动到tidyr,因为这样我的包会依赖太多的依赖项,会无缘无故地变得非常沉重……),也许如果您有cast()和melt()之类的函数,这对我来说会非常方便。想在推特上讨论吗?当然,或者通过电子邮件。
    m<-matrix(data=1, nrow=5, ncol=5)
    
    lapply(X = seq(nrow(m)), FUN = function(r){
      m[r,]<<-seq(5)
    })
    
    mclapply(X = seq(nrow(m)), FUN = function(r){
      m[r,]<<-seq(5)
    })
    
    library(future)
    plan(multiprocess) 
    
    m <- matrix(data = 1, nrow = 5, ncol = 5)
    
    # we create a set of futures, so the values are calculated in parallele and
    # not sent back to the main environment
    fs <- lapply(seq(nrow(m)), function(x) future(seq(5) + x))
    
    # when then pull the values one by one and apply them where they belong
    for (i in seq(nrow(m))) {
      m[i, ] <- value(fs[[i]])
    }
    
    # or the same way you did it:
    lapply(X = seq(nrow(m)), FUN = function(r){
      m[r,] <<- value(fs[[r]]) 
    })