numpy 使用内存Map缓冲区进行scipy稀疏

fzwojiic  于 2023-04-21  发布在  其他
关注(0)|答案(3)|浏览(121)

我必须处理稀疏矩阵,偶尔会非常大,接近或超过RAM容量。我还需要支持mat*vecmat*mat操作。
由于csr_matrix内部是3个数组dataindicesindptr,因此可以从numpy memmap创建csr矩阵。

cunj1qz1

cunj1qz11#

这可以部分工作,直到你尝试对数组做很多事情。如果你子集,子数组很有可能会被完全读入内存,否则你会得到一个错误。
这里的一个重要考虑是,底层代码是假设数组是典型的内存中numpy数组来编写的。对于mmapped数组和内存数组,随机访问的成本是非常不同的。事实上,这里的大部分代码(在编写时)都是用Cython编写的,它可能无法处理更奇特的数组类型。
此外,只要内存数组的行为相同,大多数代码都可以随时更改。当我了解到我使用的一些代码正在这样做时,我个人对此感到非常震惊,但底层数组使用h5py.Dataset s。它工作得非常好,直到scipy的bug修复版本完全打破了它。

oyxsuwqo

oyxsuwqo2#

我通过做这些事情来让它有效地工作:

  • 我使用tobytes()dataindicesindptr转储到二进制文件中。
  • 我加载了每个数组的mmap对象。
  • 我确保indicesindptr的数据类型相同;否则,当您构造csr_matrix时,其中一个将被转换。
  • 我明确地提供了稀疏矩阵的shape;否则构造函数将检查数组内容,这会使构造变慢。
  • 最后,也是这个列表中最特别的事情,我编辑了我的本地scipy/sparse/_compressed.py脚本,在矩阵构造函数中调用get_index_dtype()时关闭了check_contents(通过将其设置为False)。

我怀疑如果没有我编辑scipy源代码,构造函数也会成功,但这需要很长时间。通过上述步骤,加载一个大型mmapping稀疏矩阵基本上是即时的,我可以在上面执行我需要的操作。

clj7thdc

clj7thdc3#

这工作没有任何问题。

相关问题