将内存映射缓冲区用于 scipy 稀疏
Using memory mapped buffers for scipy sparse
我必须处理偶尔会非常大、接近或超过 RAM 容量的稀疏矩阵。我还需要支持 mat*vec
和 mat*mat
操作。
因为内部 csr_matrix
是 3 个数组 data
、indices
和 indptr
是否可以从 numpy memmap 创建一个 csr 矩阵。
这没有任何问题。
这可以部分起作用,直到您尝试对数组做很多事情。如果您进行子集化,子数组很有可能会被完全读入内存,否则您会收到错误消息。
这里的一个重要考虑因素是编写底层代码时假定数组是典型的内存中 numpy 数组。 mmapped 数组和内存数组的随机访问成本非常不同。事实上,这里的大部分代码(在撰写本文时)都是用 Cython 编写的,它可能无法处理更多奇异的数组类型。
此外,只要内存数组的行为相同,大部分代码都可以随时更改。当我了解到一些与我一起工作的代码正在执行此操作时,这让我个人感到痛苦,但底层数组使用 h5py.Dataset
s。它运行得非常好,直到 scipy
的错误修复版本完全破坏了它。
我必须处理偶尔会非常大、接近或超过 RAM 容量的稀疏矩阵。我还需要支持 mat*vec
和 mat*mat
操作。
因为内部 csr_matrix
是 3 个数组 data
、indices
和 indptr
是否可以从 numpy memmap 创建一个 csr 矩阵。
这没有任何问题。
这可以部分起作用,直到您尝试对数组做很多事情。如果您进行子集化,子数组很有可能会被完全读入内存,否则您会收到错误消息。
这里的一个重要考虑因素是编写底层代码时假定数组是典型的内存中 numpy 数组。 mmapped 数组和内存数组的随机访问成本非常不同。事实上,这里的大部分代码(在撰写本文时)都是用 Cython 编写的,它可能无法处理更多奇异的数组类型。
此外,只要内存数组的行为相同,大部分代码都可以随时更改。当我了解到一些与我一起工作的代码正在执行此操作时,这让我个人感到痛苦,但底层数组使用 h5py.Dataset
s。它运行得非常好,直到 scipy
的错误修复版本完全破坏了它。