Python内存映射

时间:2014-12-10 12:06:28

标签: python numpy

我正在处理大数据,并且我的矩阵大小为2000x100000,所以为了更快地工作,我尝试使用numpy.memmap来避免由于RAM限制而在内存中存储这个大矩阵。问题是,当我将相同的矩阵存储在2个变量中时,即一个用numpy.load,另一个用np.memmap,内容不一样。这是正常的吗?我在memmap中使用与我的数据中相同的数据类型。例如:

A1 = numpy.load('mydata.npy')
A2 = numpy.memmap('mydata.npy',dtype=numpy.float64, mode='r', shape=(2000,2000))
A1[0,0] = 0
A2[0,0] = 1.8758506894003703e-309

在两种情况下都是数组第一个元素的内容。正确的一个是值0但我通过使用memmap得到这个奇怪的数字。 谢谢。

1 个答案:

答案 0 :(得分:18)

NPY格式不仅仅是将数组的数据转储到文件中。它包括一个标题,其中包含定义数组数据类型和形状的元数据。当您直接使用memmap时,您的内存映射不会考虑存储元数据的文件头。要创建NPY文件的内存映射视图,可以使用mmap_mode的{​​{1}}选项。

这是一个例子。首先,创建一个NPY文件:

np.load

请使用In [1]: a = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) In [2]: np.save('a.npy', a)

重新阅读
np.load

使用In [3]: a1 = np.load('a.npy') In [4]: a1 Out[4]: array([[ 1., 2., 3.], [ 4., 5., 6.]]) 错误地查看文件:

memmap

使用带有In [5]: a2 = np.memmap('a.npy', dtype=np.float64, mode='r', shape=(2, 3)) In [6]: a2 Out[6]: memmap([[ 1.87585069e-309, 1.17119999e+171, 5.22741680e-037], [ 8.44740097e+252, 2.65141232e+180, 9.92152605e+247]]) 选项的memmap创建np.load

mmap_mode='r'