0

我有一些变量,包括字典、列表列表和 numpy 数组。我使用以下代码保存所有这些,其中 obj=[var1,var2,...,varn]。变量大小足够小,可以加载到内存中。

我的问题是当我在 matlab 中保存相应的变量时,输出文件在磁盘上占用的空间比在 python 中要少得多。同样,从磁盘加载变量在 python 中加载到内存中的时间比在 matlab 中要多得多。

with open(filename, 'wb') as output:
    pickle.dump(obj, output, pickle.HIGHEST_PROTOCOL)

谢谢

4

3 回答 3

2

尝试这个:

保存到磁盘

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()
于 2014-09-07T16:53:51.073 回答
1

Matlab 使用 HDF5 和压缩来保存 mat-Files;HDF5 是一种可以非常快速地访问大量数据的格式。Python-pickle 保护信息以重新创建对象,它没有针对速度和大小进行优化,而是针对灵活性进行了优化。如果您愿意,请使用 HDF5 for python。

于 2014-09-07T16:48:38.627 回答
0

好吧,问题在于 pickle 而不是 Python 本身。正如其他人所提到的,以 7.3 或更高版本保存的 .mat 文件使用 HDF5 格式。HDF5 已针对高效存储和检索大型数据集进行了优化;Pickle 以不同的方式处理数据。您可以使用 h5py 或 netcf4 Python 模块复制甚至超越 Matlab 的保存功能;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()给你变量名。如果其中一个变量是一个名为“data”的数组,您可以通过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。对于其他一切,泡菜对我来说效果很好。

于 2014-09-09T00:43:49.873 回答