首页 > 解决方案 > R(或Rcpp)中的并行稀疏矩阵rowSums

问题描述

对于在 R 中对稀疏矩阵中的所有行求和的简单任务,Matrix::rowSums()做得很好:

library(Matrix)    
m <- rsparsematrix(10000, 5000, 0.1)
rsums <- Matrix::rowSums(m)

显然,这个函数可以通过按行阻塞求和来并行化。有哪些选择?我似乎找不到任何东西。

为一些基准测试奠定基础......

library(rbenchmark)
benchmark(
        "Matrix::rowSums" = {
            Matrix::rowSums(m)
        },
        replications = 10,
        columns = c("test", "replications", "elapsed", "relative", "user.self", "sys.self"))


#              test replications elapsed relative user.self sys.self
# 1 Matrix::rowSums           10    1.14        1      0.95     0.19

我准备使用最快的解决方案,R 或 Rcpp。

请参阅 Will Townes 关于循环稀疏矩阵的这项杰出研究:https ://rpubs.com/will_townes/sparse-apply 。结论似乎是Matrix::rowSumsand family 是可靠的执行者,并且可以使用slamand/or实现并行化data.table

标签: rsparse-matrixrcpp

解决方案


我看不出如何以面向列的稀疏矩阵格式或坐标稀疏矩阵格式并行化行求和,这是 Matrix 存储稀疏矩阵的两种格式。行不是内存连续的。如果您将一组行分块并将其提供给线程,则该线程将必须读取整个矩阵数据结构才能为您提供该块的行和。如果你将它分块并运行 10 个线程,你可能拥有 10 倍的处理能力,但你必须做 10 倍的工作。


推荐阅读