python - 用于数据库目的的最合适的 .mat 文件转换

标签 python json matlab numpy pickle

我正在尝试创建一个结构非常灵活的实验结果数据库(因为不同的实验需要不同的实验条件)。目前,我正在考虑使用 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 格式,但我愿意接受建议。

提前致谢!

最佳答案

正如 @Matti 所说,HDF5 值得尝试,实现它的一个简单方法是使用 pytables .

但目前,至少使用 np.savez_compressed() 而不是 np.save() 来比较 numpy。

关于python - 用于数据库目的的最合适的 .mat 文件转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15901910/

相关文章:

python - 运行时重载运算符

JavaScript:动态添加新值以更新 JSON/对象

matlab - 无监督过滤器特征选择 - 按相关性排名

python - 在Shinyproxy中为Dash应用交付静态 Assets 时出错

python - 如何让 PyC​​harm 在安装库时忽略 SSL 错误?

python - 如何在 jinja2 过滤器中使用嵌套 if

c# - 使用 JSON.NET 将已知和未知的 JSON 字段反序列化为 CLR 对象

python - TypeError: a bytes-like object is required, not 'str' – 在Python中保存JSON数据

c++ - 找不到版本 GLIBCXX_3.4.11(buildW.mexglx 需要)

Matlab find 不适用于高维数组?