我有一些变量,包括字典、列表和numpy数组。我用以下代码保存了所有变量,其中obj=[var1,var2,…,varn]。变量大小足够小,可以加载到内存中。
我的问题是,当我在matlab中保存相应的变量时,输出文件在磁盘上占用的空间比在python中要小得多。类似地,从磁盘加载变量需要比matlab多得多的时间才能在python中加载到内存中。
with open(filename, 'wb') as output:
pickle.dump(obj, output, pickle.HIGHEST_PROTOCOL)
感谢
试试这个:
保存到磁盘
import gzip
gz = gzip.open(filename + '.gz', 'wb')
gz.write(pickle.dumps(obj, pickle.HIGHEST_PROTOCOL))
gz.close()
从磁盘加载
import gzip
gz = gzip.open(filename + '.gz', 'rb')
obj = pickle.loads(gz.read())
gz.close()
Matlab使用HDF5和压缩来保存mat文件;HDF5是一种非常快速地访问大量数据的格式。Python pickle保护信息以重新创建对象,它没有针对速度和大小进行优化,但具有灵活性。如果您愿意,可以使用HDF5作为python。
问题在于pickle,而不是Python本身。正如其他人所提到的,以7.3或更高版本保存的.mat文件使用HDF5格式。HDF5经过优化,可有效存储和检索大型数据集;Pickle处理数据的方式不同。使用h5py或netcf4 Python模块,可以复制甚至超越Matlab的save函数的性能;NetCDF是HDF5的一个子集。例如,使用HDF5,您可以执行以下操作:
import h5py
import numpy as np
f = h5py.File('test.hdf5','w')
a = np.arange(10)
dset = f.create_dataset("init", data=a)
f.close()
我不确定在MATLAB中进行等效操作是否会产生完全相同大小的文件,但应该很接近。你可以使用HDF5的压缩功能来获得你想要的结果。
编辑1:
要加载HDF5文件,例如.mat
文件,可以执行类似M2 = h5py.File('file.mat')
的操作。M2是一个HDF5组,有点像python字典。执行M2.keys()
将为您提供变量名称。如果其中一个变量是一个称为"0"的数组;数据";,你可以通过做data = M2["data"][:]
来读出它。
编辑2:
要保存多个变量,可以创建多个数据集。基本语法为f.create_dataset("variable_name", data=variable)
。有关更多选项,请参阅链接。例如
import h5py
import numpy as np
f = h5py.File('test.hdf5','w')
data1 = np.ones((4,4))
data2 = 2*data1
f.create_dataset("ones", data=data1)
f.create_dataset("twos", data=data2)
f
既是一个文件对象,又是一个HDF5组。所以做f.keys()
给出:
[u'ones', u'twos']
要查看"ones"键下存储的内容,您可以执行以下操作:
f['ones'][:]
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
您可以创建任意数量的数据集。编写完文件后,关闭文件对象:f.close()
。
我应该补充一点,我在这里的方法只适用于类似数组的数据集。您可以保存其他Python对象,如列表和字典,但这样做需要做更多的工作。我只对大型numpy数组使用HDF5。对于其他一切,pickle对我来说都很好。