2

次のコードを使用して、Python で MAT ファイルを読み込もうとしています。MATLAB で問題なく読み込むことができます。

from scipy.io import loadmat
test_filename = 'test_data.mat' #This is a struct
data =loadmat(test_filename, struct_as_record=True)

そのコードを実行すると、次のエラーが発生します。

Traceback (most recent call last):
  File "C:\Users\mac389\workspace\nexUtils\src\qA.py", line 16, in <module>
data =loadmat(test_filename, struct_as_record=True)
  File "C:\Python27\lib\site-packages\scipy\io\matlab\mio.py", line 175, in loadmat
matfile_dict = MR.get_variables(variable_names)
  File "C:\Python27\lib\site-packages\scipy\io\matlab\mio5.py", line 272, in get_variables
hdr, next_position = self.read_var_header()
  File "C:\Python27\lib\site-packages\scipy\io\matlab\mio5.py", line 224, in read_var_header
stream = BytesIO(dcor.decompress(data))
MemoryError

参考までに、test_data.mat は次のフィールドを含む構造体です (MATLAB コンソールから)。

 version: 101
 comment: 'molecular layer 4/17'
    freq: 40000
    tbeg: 0
    tend: 1.3950e+003
  events: {3x1 cell}
 neurons: {50x1 cell}
   waves: {102x1 cell}
contvars: {64x1 cell}

Test_data.mat は 217 MB です。私は4GBのRAMを持っています。SciPy 0.10.0 と NumPy 1.6.1 を使用しています。「struct_as_record」フィールドを変更しても何も起こりません。

フィールドがセル配列である構造体をロードするにはどうすればよいですか?

4

2 に答える 2

3

私は答えを見つけました。

Loadmat は、大きくネストされた構造を処理できません。私が与えられたデータセットでは、構造体フィールドのうちの 3 つ、「waves、ニューロン、contvars」がセル配列でした。そのセル配列の各メンバーは構造体でした。これらの構造体のフィールドの一部は、それ自体がセル配列でした。これらの cell 配列には、データを含む 1 つのフィールドがありました。データを整理するこの非標準的な方法とドキュメントの欠如が問題を引き起こしました。

これは、データ ストレージ形式を作成している場合は、できるだけテキスト ファイル形式に固執するための注意書きとして役立つと思います。本当に非標準の形式を選択した場合は、後継者に慈悲を与え、その事実を文書化してください...

于 2012-06-16T22:26:41.567 に答える
1

解凍の実装方法により、Python ではより多くのメモリが必要になると思います。圧縮せずに Matlab に保存してみてください (-v6バージョン 6 形式には圧縮機能がありません)。

于 2012-06-16T11:30:06.177 に答える