Java中的并行访问稀疏矩阵

Java中的并行访问稀疏矩阵,java,concurrency,linear-algebra,sparse-matrix,Java,Concurrency,Linear Algebra,Sparse Matrix,我正在寻找一个Java中的矩阵/线性代数库,它提供了一个可以从不同线程并发写入的稀疏矩阵。我遇到的大多数库要么根本不提供稀疏矩阵,要么1.)使用开放寻址哈希映射返回它们,或者2.)以CSR或CSC格式存储,这根本不适合多线程构造。现在我正在使用并发哈希映射并行地收集条目,并从单个线程填充稀疏矩阵,但这似乎是对资源的浪费(存储并发哈希映射的空间和填充矩阵两次的时间).你不能只是神奇地使稀疏矩阵代数例程可伸缩地并行。解决这些问题涉及到一些最复杂的数值分析算法,并且仍然是深入研究的主题 你们并没有说你

我正在寻找一个Java中的矩阵/线性代数库,它提供了一个可以从不同线程并发写入的稀疏矩阵。我遇到的大多数库要么根本不提供稀疏矩阵,要么1.)使用开放寻址哈希映射返回它们,或者2.)以CSR或CSC格式存储,这根本不适合多线程构造。现在我正在使用并发哈希映射并行地收集条目,并从单个线程填充稀疏矩阵,但这似乎是对资源的浪费(存储并发哈希映射的空间和填充矩阵两次的时间).

你不能只是神奇地使稀疏矩阵代数例程可伸缩地并行。解决这些问题涉及到一些最复杂的数值分析算法,并且仍然是深入研究的主题

你们并没有说你们想用这些矩阵做什么,但我想你们想要线性方程组的解。如果你想并行使用,那么你需要一个第三方库,非常大的矩阵,可能还需要一些钱


组装稀疏矩阵最常用的方法是以三元组格式组装它们,并转换为压缩的行或列格式。组装可能很昂贵,但很容易并行完成。只要让每个线程都有自己的三元组列表,并在转换为压缩格式之前将它们拼接在一起。

你不能神奇地使稀疏矩阵代数例程以可伸缩的方式并行。解决这些问题涉及到一些最复杂的数值分析算法,并且仍然是深入研究的主题

你们并没有说你们想用这些矩阵做什么,但我想你们想要线性方程组的解。如果你想并行使用,那么你需要一个第三方库,非常大的矩阵,可能还需要一些钱


组装稀疏矩阵最常用的方法是以三元组格式组装它们,并转换为压缩的行或列格式。组装可能很昂贵,但很容易并行完成。只要让每个线程都有自己的三元组列表,并在转换为压缩格式之前将它们拼接在一起。

我记得矩阵是线程安全的。该库是colt的多线程版本

我记得矩阵是线程安全的。该库是colt的多线程版本

你试过柯尔特吗?我看过柯尔特。它们的稀疏矩阵()的问题,如实现说明中所详细说明的,是它使用了OpenIntDoubleHashMap,因此不同步?我看过柯尔特。它们的稀疏矩阵()的问题,如实现说明中所述,是它使用了OpenIntDoubleHashMap,因此不同步。嘿,David,感谢您的回复。我其实不想用矩阵来解线性系统。但是,我需要计算一个矩阵向量积。然而,我从您的回答中了解到,同时构建稀疏矩阵更像是“滚动您自己的”类型的事情?矩阵向量积可以并行运行,但您需要大型矩阵才能使其有价值。当然,您不需要压缩存储来执行该操作,但它可能仍然更高效。您目前如何构建矩阵?您使用三元组吗?现在我正在使用ApacheCommons数学稀疏矩阵实现。它是我上面提到的其中一个不是线程安全的,并且有一个哈希映射作为支持。目前,我通过将所有条目放入ConcurrentHashMap来构建矩阵,然后在单个线程中从该哈希映射顺序构建矩阵。我想我需要一个矩阵类,我可以把已经构造好的三元组列表交给它,或者它本身就是线程安全的。它们的大小从小(~10000 x 10000)到中(~100000 x 100000)不等,有些将来可能会更大。它们的密度通常在1%左右。如果你只是将矩阵乘以某个值,你不需要它来保证线程安全。您可以将问题拆分为并行任务,但在将任务的结果放在一起时要小心。你还必须注意,所有任务都以完全相同的矩阵开始。嘿,大卫,谢谢你的回答。我其实不想用矩阵来解线性系统。但是,我需要计算一个矩阵向量积。然而,我从您的回答中了解到,同时构建稀疏矩阵更像是“滚动您自己的”类型的事情?矩阵向量积可以并行运行,但您需要大型矩阵才能使其有价值。当然,您不需要压缩存储来执行该操作,但它可能仍然更高效。您目前如何构建矩阵?您使用三元组吗?现在我正在使用ApacheCommons数学稀疏矩阵实现。它是我上面提到的其中一个不是线程安全的,并且有一个哈希映射作为支持。目前,我通过将所有条目放入ConcurrentHashMap来构建矩阵,然后在单个线程中从该哈希映射顺序构建矩阵。我想我需要一个矩阵类,我可以把已经构造好的三元组列表交给它,或者它本身就是线程安全的。它们的大小从小(~10000 x 10000)到中(~100000 x 100000)不等,有些将来可能会更大。它们的密度通常在1%左右。如果你只是将矩阵乘以某个值,你不需要它来保证线程安全。您可以将问题拆分为并行任务,但在将任务的结果放在一起时要小心。您还必须注意,所有任务都以完全相同的矩阵开始。看起来,尽管一些操作矩阵操作在“并行colt”中并行化,但实际的稀疏矩阵实现与colt基本相同。这意味着它使用相同的后端存储,这对wri来说不是线程安全的