Python 使用scipy从mat读取超长数组

Python 使用scipy从mat读取超长数组,python,numpy,scipy,mat,Python,Numpy,Scipy,Mat,我有一个来自Dymola(.mat v4)的结果文件,它将所有变量存储在一个巨大的1D数组中(一个数组中的数据大小为2GB…)。我对文件格式无能为力,因为我们必须使用Dymola。当尝试使用scipy(使用Python 2.7.13 64位)读取文件时,出现以下错误: C:\Users\...\scipy\io\matlab\mio4.py:352: RuntimeWarning: overflow encountered in long_scalars remaining_bytes = h

我有一个来自Dymola(.mat v4)的结果文件,它将所有变量存储在一个巨大的1D数组中(一个数组中的数据大小为2GB…)。我对文件格式无能为力,因为我们必须使用Dymola。当尝试使用scipy(使用Python 2.7.13 64位)读取文件时,出现以下错误:

C:\Users\...\scipy\io\matlab\mio4.py:352: RuntimeWarning: overflow encountered 
in long_scalars
remaining_bytes = hdr.dtype.itemsize * n
C:\...\scipy\io\matlab\mio4.py:172: RuntimeWarning: overflow 
encountered in long_scalars
num_bytes *= d
Traceback (most recent call last):
File 
...
self.mat = scipy.io.loadmat(fileName, chars_as_strings=False)
File "C:\...\scipy\io\matlab\mio.py", line 136, in loadmat
matfile_dict = MR.get_variables(variable_names)
File "C:\...\scipy\io\matlab\mio4.py", line 399, in get_variables
mdict[name] = self.read_var_array(hdr)
File "C:\...\scipy\io\matlab\mio4.py", line 374, in read_var_array
return self._matrix_reader.array_from_header(header, process)
File "C:\...\scipy\io\matlab\mio4.py", line 137, in array_from_header
arr = self.read_full_array(hdr)
File "C:\...\scipy\io\matlab\mio4.py", line 207, in read_full_array
return self.read_sub_array(hdr)
File "C:\...\scipy\io\matlab\mio4.py", line 178, in read_sub_array
"`variable_names` kwarg to `loadmat`" % hdr.name)
ValueError: Not enough bytes to read matrix 'data_2'; is this a badly-formed 
file? Consider listing matrices with `whosmat` and loading named matrices with `variable_names` kwarg to `loadmat`

我很清楚这个错误/问题。我的问题:有什么解决办法吗?我还能读取文件并获取数据吗?是否可以在读取阵列时拆分阵列

我建议您启用基于HDF5的SDF文件格式转换。这种格式可以更好地处理大型文件。请参见模拟/设置


或者,您可以使用Dymola中的变量选择来减少文件中存储的变量数量

我建议您启用基于HDF5的SDF文件格式转换。这种格式可以更好地处理大型文件。请参见模拟/设置


或者,您可以使用Dymola中的变量选择来减少文件中存储的变量数量

可能重复。。。我不同意。这当然不是上面链接的问题的重复。@littleHue您能具体解释一下您对错误的解释吗?虽然信息对你来说可能很清楚,但对每个知道解决方案的人来说可能并不清楚,或者你的解释可能是错误的据我所知,错误信息文件已损坏。嗨,链接问题的区别在于文件格式。我不确定是否可以使用fseek/read读取.mat文件@kazemakase:数组的条目数超过了long_int允许的数量。这是因为Dymola用来保存结果的愚蠢格式。关键错误消息是:在长标量中遇到溢出剩余字节=hdr.dtype.itemsize*n@littleHue请原谅我的愚蠢问题——我对迪莫拉不熟悉。你是说Dymola以Matlab的.mat文件格式保存结果,但不符合规范?或者该文件是否正常,并且scipy的
loadmat
例程中存在错误?可能重复。。。我不同意。这当然不是上面链接的问题的重复。@littleHue您能具体解释一下您对错误的解释吗?虽然信息对你来说可能很清楚,但对每个知道解决方案的人来说可能并不清楚,或者你的解释可能是错误的据我所知,错误信息文件已损坏。嗨,链接问题的区别在于文件格式。我不确定是否可以使用fseek/read读取.mat文件@kazemakase:数组的条目数超过了long_int允许的数量。这是因为Dymola用来保存结果的愚蠢格式。关键错误消息是:在长标量中遇到溢出剩余字节=hdr.dtype.itemsize*n@littleHue请原谅我的愚蠢问题——我对迪莫拉不熟悉。你是说Dymola以Matlab的.mat文件格式保存结果,但不符合规范?或者该文件是否正常,并且scipy的
loadmat
例程中存在错误?我可以使用scipy或hdf5py读取SDF文件吗?否则,我将遇到与以前相同的问题,因为我需要编写自己的加载程序。减少变量的数量是可以做到的,但这不是一个好的解决方案,因为我讨厌扔掉有价值的数据。是的。SDF只是本地HDF5的映射。Dymola中也有一些Python脚本可以帮助您。非常感谢,我将尝试一下。比重写mat读取器方便得多:-)我可以用scipy或hdf5py读取SDF文件吗?否则,我将遇到与以前相同的问题,因为我需要编写自己的加载程序。减少变量的数量是可以做到的,但这不是一个好的解决方案,因为我讨厌扔掉有价值的数据。是的。SDF只是本地HDF5的映射。Dymola中也有一些Python脚本可以帮助您。非常感谢,我将尝试一下。比重写mat读取器方便得多:-)