我有几个大的 .mtx(范围从 2-12 GB),我试图将它们加载到 Python 中的稀疏矩阵中,但它不起作用。我自己在同一台机器上生成了文件,没有错误,所以我在这里完全困惑了。
获取文件信息效果很好:
from scipy.io import mminfo,mmread
mminfo(filename)
>>> (8649029, 181, 110656308, 'coordinate', 'real', 'general')
但是如果我尝试将文件加载到内存中:
mat = mmread(filename)
它只是挂起。等待一个小时后,我尝试中断内核(这是在 Windows 7 机器上的 IPython 笔记本上),但这也会挂起,我必须关闭笔记本才能停止它。我从命令行重复了它,得到了类似的结果。这次我可以用 ctrl-c 中断,但遇到了某种我以前从未见过的系统错误(没有 Python 异常):
forrtl: error (200): program aborting due to control-C event
Image PC Routine Line Source
kernel32.dll 0000000076CC4803 Unknown Unknown Unknown
kernel32.dll 0000000076C8652D Unknown Unknown Unknown
ntdll.dll 0000000076EBC541 Unknown Unknown Unknown
我什至尝试通过 Python 解释器在 Mac 上加载相同的文件。这也挂起,如果不关闭我的终端会话就无法中断。
知道这里会发生什么吗?
我见过类似的大文件在 scipy 中的 I/O 需要很长时间。当时,我考虑将它们写为二进制而不是 ASCII MTX 格式,这将减少所需的 I/O 量。请参阅 Scipy I/O Cookbook,特别是标题为“使用元数据将 Fortran 或 C 数组写入二进制文件”的部分。
libpny
需要链接。
使用 fast-matrix-market 而不是
scipy.io
对我有用。根据包装的网页:
在大型矩阵(维度 > 2^31)上崩溃,因为它在大多数平台上使用 32 位索引。scipy.io.mmread()
import fast_matrix_market as fmm
mat = fmm.mmread(filename)