1

非常に柔軟な構造を持つ実験結果のデータベースを作成しようとしています (実験ごとに異なる実験条件が必要になるため)。今のところ、「辞書のような」性質を持つ JSON を最も適切な形式として使用することを考えています。

私の生データ ファイルは Matlab ファイル (.mat 拡張子) として入ってきますが、変換後にファイル サイズがほぼ 10 倍に増加することに気付きました。これは私が選択した形式に固有の問題なのか、それとも何かできることがあるのだろうかと考えていました。

変換効率をテストするために作成したサンプル コードと、実行したサンプル ファイルを次に示します。

import numpy as np
import scipy.io as spio
import json
import pickle
import os

def json_dump(data):
    with open('json.txt.','w') as outfile:
        json.dump(data,outfile)
    print 'JSON file size: ', os.path.getsize('json.txt')/1000, ' kB'

def pickle_dump(data):
    with open('pickle.pkl','w') as outfile:
        pickle.dump(data,outfile)
    print 'Pickle file size: ', os.path.getsize('pickle.pkl')/1000, ' kB'

def numpy_dump(data):
    np.save('numpy.npy',data)
    print 'NPY file size: ', os.path.getsize('numpy.npy')/1000, ' kB'

    np.savetxt('numpy.txt',data)
    print 'Numpy text file size: ', os.path.getsize('numpy.txt')/1000, ' kB'

def get_data(path):
    data = spio.loadmat(path)
    del data['__function_workspace__']
    del data['__globals__']
    del data['__version__']
    del data['__header__']

    spio.savemat('mat.mat',data)
    print 'Converted mat file size: ', os.path.getsize('mat.mat')/1000, ' kB'

    #Convert into list
    data = data['data'][0][0][0]
    return data

path = 'myrecording.mat'
print 'Original file size: ', os.path.getsize(path)/1000, ' kB'
data = get_data(path)
json_dump(data.tolist())
pickle_dump(data.tolist())
numpy_dump(data)

次の出力が得られます。

Original file size:  706  kB
Converted mat file size:  4007  kB
JSON file size:  9104  kB
Pickle file size:  10542  kB
NPY file size:  4000  kB
Numpy text file size:  12550  kB

ファイルサイズを制限するためにエンコーディングでできることはありますか? 私は理想的には JSON 形式に固執しますが、提案は受け付けています。

前もって感謝します!

4

2 に答える 2

1

JSON はプレーン テキストであるため、ファイルはバイナリ形式よりも大きくなります。また、HDF5 を使用することをお勧めします。

http://www.hdfgroup.org/HDF5/から:

「HDF5 は、データを保存および管理するためのデータ モデル、ライブラリ、およびファイル形式です。無制限のさまざまなデータ型をサポートし、柔軟で効率的な I/O と大量の複雑なデータ用に設計されています。」

于 2013-04-09T13:36:16.047 に答える