【问题标题】:Read very long array from mat with scipy用 scipy 从 mat 中读取很长的数组
【发布时间】:2017-05-17 13:25:27
【问题描述】:

我有一个来自 Dymola (.mat v4) 的结果文件,它将所有变量存储在一个巨大的一维数组中(一个数组中或多或少 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`

错误/问题对我来说很清楚。我的问题:有什么解决方法吗?我还能读取文件并获取数据吗?读取数组时是否可以拆分数组?

【问题讨论】:

  • 我不同意。这肯定与上面链接的问题不是重复
  • @littleHue 您能否具体说明您如何解释该错误?尽管您可能清楚该信息,但可能知道解决方案的每个人都可能不清楚,或者您的解释可能是错误的。 -- 据我了解文件已损坏的错误消息。
  • 您好,与链接问题的区别在于文件格式。我不确定是否可以使用 fseek/read 读取 .mat 文件。 @kazemakase:数组的条目比 long_int 允许的多。这是因为 Dymola 使用愚蠢的格式来保存其结果。关键的错误信息是:在 long_scalars 中遇到溢出剩余字节 = hdr.dtype.itemsize * n
  • @littleHue 请原谅我的愚蠢问题——我不熟悉 Dymola。您是说 Dymola 将结果保存为 Matlab 的 .mat 文件格式但不符合规范?还是文件没问题,scipy 的loadmat 例程中存在错误?

标签: python numpy scipy mat


【解决方案1】:

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

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

【讨论】:

  • 我可以用 scipy 或 hdf5py 读取 SDF 文件吗?否则,我将遇到与以前相同的问题,因为我需要编写自己的加载程序。可以减少变量的数量,但这不是一个好的解决方案,因为我讨厌丢弃有价值的数据。
  • 是的。 SDF 只是到原生 HDF5 的映射。 Dymola 中也有一些 Python 脚本可以帮助您。
  • 非常感谢,我试试看。比重写 mat-Reader 方便得多:-)
猜你喜欢
  • 2017-07-25
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
  • 2017-12-24
相关资源
最近更新 更多