通过 scipy.io 在 Python 中加载 Python 的巨型八度矩阵



我想在python中加载一些以八度生成并保存为.mat文件的矩阵。 我将它们保存为:save -v7 'y.mat' Ysave ('y.mat', 'Y', '-v7')

其中一个矩阵是 50 x 50,另一个是 10,000,000 x 50。

我在 python 中加载它们为:

import scipy.io as sio
Y = sio.loadmat('y.mat')

较小的矩阵已正确加载,输出是一个数组的字典以及有关标头、版本等的信息。

问题是更大的矩阵不会加载,结果是OSError: could not read bytes完整错误如下:

OSError                                   Traceback (most recent call last)
<ipython-input-19-b5ea6427914d> in <module>()
----> 1 Y = sio.loadmat('y.mat')
/usr/lib/python3/dist-packages/scipy/io/matlab/mio.py in loadmat(file_name, mdict, appendmat, **kwargs)
134     variable_names = kwargs.pop('variable_names', None)
135     MR = mat_reader_factory(file_name, appendmat, **kwargs)
--> 136     matfile_dict = MR.get_variables(variable_names)
137     if mdict is not None:
138         mdict.update(matfile_dict)
/usr/lib/python3/dist-packages/scipy/io/matlab/mio5.py in get_variables(self, variable_names)
290                 continue
291             try:
--> 292                 res = self.read_var_array(hdr, process)
293             except MatReadError as err:
294                 warnings.warn(
/usr/lib/python3/dist-packages/scipy/io/matlab/mio5.py in read_var_array(self, header, process)
250            `process`.
251         '''
--> 252         return self._matrix_reader.array_from_header(header, process)
253 
254     def get_variables(self, variable_names=None):
scipy/io/matlab/mio5_utils.pyx in scipy.io.matlab.mio5_utils.VarReader5.array_from_header (scipy/io/matlab/mio5_utils.c:7578)()
scipy/io/matlab/mio5_utils.pyx in scipy.io.matlab.mio5_utils.VarReader5.array_from_header (scipy/io/matlab/mio5_utils.c:6575)()
scipy/io/matlab/mio5_utils.pyx in scipy.io.matlab.mio5_utils.VarReader5.read_real_complex (scipy/io/matlab/mio5_utils.c:8049)()
scipy/io/matlab/mio5_utils.pyx in scipy.io.matlab.mio5_utils.VarReader5.read_numeric (scipy/io/matlab/mio5_utils.c:4575)()
scipy/io/matlab/mio5_utils.pyx in scipy.io.matlab.mio5_utils.VarReader5.read_element (scipy/io/matlab/mio5_utils.c:4143)()
scipy/io/matlab/streams.pyx in scipy.io.matlab.streams.ZlibInputStream.read_string (scipy/io/matlab/streams.c:3261)()
scipy/io/matlab/streams.pyx in scipy.io.matlab.streams.ZlibInputStream.read_into (scipy/io/matlab/streams.c:3185)()
OSError: could not read bytes

有没有其他方式可以保存八度/矩阵或格式,在 python 中加载会更容易或至少可能?

我还测试了在没有版本(结果是一个巨大的文件(或其他版本中保存。

可能是内存空间不足。

10e6*50 给出 500e6 值。如果另存为双精度,则在大约 4 GB 的内存中。

我确实在Windows PC上使用Spyder IDE下的Python遇到了内存问题。 该应用程序使用pyvisa从示波器中检索曲线。示波器曲线,其中 6 个通道,每个通道 3000 万个点。当同时将所有曲线保存在内存中时,我遇到了零星的错误。当每个通道仅使用100万个点时,程序运行没有任何问题。我猜,python/numpy只能在内存中处理最多2 GB的数据。

由于我需要 3000 万个点,我的解决方案是逐个处理曲线。所以我同时在内存中只有一条曲线。

最新更新