我想执行大型矩阵乘法 C = A * B.T然后通过应用严格的阈值来过滤 C,收集形式为(行索引、列索引、值)的列表。
A 和 B 很稀疏,条目大多为零。它们最初表示为稀疏 scipy csr 矩阵。
矩阵的大小(当它们是密集格式时):
答:9G(900,000 x 1200)
B:6.75G(700,000×1200)
C、阈值处理前:5000G
C、阈值处理后:0.5G
使用 pyspark,您认为什么策略在这里最有效?我应该使用哪个抽象来并行化 A 和 B?我还应该考虑什么来优化分区大小?
我应该坚持使用 scipy 稀疏矩阵对象并将它们简单地并行化为 RDD(也许使用一些自定义序列化)?
我是否应该使用 DataFrame 存储 A 和 B 矩阵的非零条目,然后在它们位于执行器上时将它们转换为本地 pyspark 矩阵类型?
我应该使用 MLlib 的 DistributedMatrix 抽象吗?对于这个策略,我想我首先将我的 scipy csr 矩阵转换为 coo 格式,然后创建一个 pyspark CooperativeMatrix,然后转换为
- 块矩阵?密集表示,但允许与另一个分布式 BlockMatrix 进行矩阵乘法。
- 索引行矩阵?稀疏表示,但只允许与局部矩阵相乘(例如广播 SparseMatrix ?)
*编辑浏览文档也很高兴发现 IndexedRowMatrix 函数 columnSimilarities(),当目标是计算余弦相似度时,这可能是一个不错的选择。
我现在正在寻找本地解决方案。我有两台机器可用于原型设计:16G RAM、10 个 CPU 或 64G RAM、28 个 CPU。一旦我有了一个好的原型,就计划在集群上运行它。