r - 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::rowSums
and family 是可靠的执行者,并且可以使用slam
and/or实现并行化data.table
。
解决方案
我看不出如何以面向列的稀疏矩阵格式或坐标稀疏矩阵格式并行化行求和,这是 Matrix 存储稀疏矩阵的两种格式。行不是内存连续的。如果您将一组行分块并将其提供给线程,则该线程将必须读取整个矩阵数据结构才能为您提供该块的行和。如果你将它分块并运行 10 个线程,你可能拥有 10 倍的处理能力,但你必须做 10 倍的工作。
推荐阅读
- python - 严重挣扎于 sdist - 希望能够在导入时跳过文件夹
- python - Sqlalchemy 查询/过滤器以检查 INSERT Python 上的重复项
- c++ - 如何在 C++ 中实现确定性有限自动机类
- python - For循环没有遍历列表中的所有值?
- json - jq:一个 jq 命令来更新 Json 文件中的多个值
- ssis - SSIS派生列表达式 - 删除前导零
- java - 如何在没有显式代码的情况下在 mule esb 3.9 的 inboud-endpoint 上收听消息的到达?
- asp.net - 在 asp.net mvc 的单元测试中,对象引用未设置为对象问题的实例
- c# - 在 UWP 中禁用游戏手柄导航
- mongodb - MongoDB findOneAndUpdate 写入冲突显着影响性能