我正在尝试创建一个具有非常灵活结构的实验结果数据库(因为不同的实验需要不同的实验条件)。目前,我正在考虑将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格式,但我愿意接受建议。
提前致谢!
答案 0 :(得分:1)
JSON是纯文本,因此文件将比二进制格式更大。我还建议您使用HDF5。
来自http://www.hdfgroup.org/HDF5/:
“HDF5是用于存储和管理数据的数据模型,库和文件格式。它支持无限种类的数据类型,专为灵活高效的I / O和大容量和复杂数据而设计。”
答案 1 :(得分:1)
正如@Matti所说,HDF5很适合尝试,实现它的简单方法是使用pytables。
目前,至少使用np.savez_compressed()
代替np.save()
来比较numpy。