我必须处理稀疏矩阵,偶尔会非常大,接近或超过RAM容量。我还需要支持mat*vec和mat*mat操作。由于csr_matrix内部是3个数组data,indices和indptr,因此可以从numpy memmap创建csr矩阵。
mat*vec
mat*mat
csr_matrix
data
indices
indptr
cunj1qz11#
这可以部分工作,直到你尝试对数组做很多事情。如果你子集,子数组很有可能会被完全读入内存,否则你会得到一个错误。这里的一个重要考虑是,底层代码是假设数组是典型的内存中numpy数组来编写的。对于mmapped数组和内存数组,随机访问的成本是非常不同的。事实上,这里的大部分代码(在编写时)都是用Cython编写的,它可能无法处理更奇特的数组类型。此外,只要内存数组的行为相同,大多数代码都可以随时更改。当我了解到我使用的一些代码正在这样做时,我个人对此感到非常震惊,但底层数组使用h5py.Dataset s。它工作得非常好,直到scipy的bug修复版本完全打破了它。
h5py.Dataset
scipy
oyxsuwqo2#
我通过做这些事情来让它有效地工作:
tobytes()
shape
scipy/sparse/_compressed.py
get_index_dtype()
check_contents
False
我怀疑如果没有我编辑scipy源代码,构造函数也会成功,但这需要很长时间。通过上述步骤,加载一个大型mmapping稀疏矩阵基本上是即时的,我可以在上面执行我需要的操作。
clj7thdc3#
这工作没有任何问题。
3条答案
按热度按时间cunj1qz11#
这可以部分工作,直到你尝试对数组做很多事情。如果你子集,子数组很有可能会被完全读入内存,否则你会得到一个错误。
这里的一个重要考虑是,底层代码是假设数组是典型的内存中numpy数组来编写的。对于mmapped数组和内存数组,随机访问的成本是非常不同的。事实上,这里的大部分代码(在编写时)都是用Cython编写的,它可能无法处理更奇特的数组类型。
此外,只要内存数组的行为相同,大多数代码都可以随时更改。当我了解到我使用的一些代码正在这样做时,我个人对此感到非常震惊,但底层数组使用
h5py.Dataset
s。它工作得非常好,直到scipy
的bug修复版本完全打破了它。oyxsuwqo2#
我通过做这些事情来让它有效地工作:
tobytes()
将data
、indices
和indptr
转储到二进制文件中。indices
和indptr
的数据类型相同;否则,当您构造csr_matrix
时,其中一个将被转换。shape
;否则构造函数将检查数组内容,这会使构造变慢。scipy/sparse/_compressed.py
脚本,在矩阵构造函数中调用get_index_dtype()
时关闭了check_contents
(通过将其设置为False
)。我怀疑如果没有我编辑scipy源代码,构造函数也会成功,但这需要很长时间。通过上述步骤,加载一个大型mmapping稀疏矩阵基本上是即时的,我可以在上面执行我需要的操作。
clj7thdc3#
这工作没有任何问题。