我想在Python中加载一些矩阵,这些矩阵已经在八度音阶中生成并保存为.mat
文件。我将它们保存为:save -v7 'y.mat' Y
或save ('y.mat', 'Y', '-v7')
其中一个矩阵是50 × 50,另一个矩阵是10,000,000 × 50。
我用Python皮把它们装成:
import scipy.io as sio
Y = sio.loadmat('y.mat')
较小的矩阵已正确加载,输出为数组字典和有关标题、版本等信息。
问题是较大的matric不加载,结果是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
有没有其他方法octave/matlab或格式保存,这将是更容易或至少有可能加载在python?
我还测试了保存无版本(结果是一个巨大的文件)或在其他版本。
1条答案
按热度按时间bvjxkvbb1#
可能是内存空间不足。
10 e6 *50提供500 e6个值。如果保存为双精度值,则需要大约4 GB的内存。
我在我的Windows PC上使用Spyder IDE下的Python时遇到了内存问题。该应用程序使用pyvisa从oszilloscope中检索曲线。oszilloscope曲线有6个通道,每个通道有3000万个点。当同时将所有曲线保存在内存中时,我遇到了零星的错误。当每个通道只使用100万个点时,程序运行没有任何问题。我猜,python / numpy只能处理内存中最多2 GB的数据。
因为我需要3000万个点,所以我的解决方案是一条一条地处理曲线,所以我在同一时间只有一条曲线在内存中。