我正在处理大数据,并且矩阵的大小约为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得到了这个怪异的数字。
谢谢你。

最佳答案

NPY格式不仅仅是将数组数据转储到文件中。它包括一个 header ,该 header 除其他外还包含定义数组的数据类型和形状的元数据。当像完成操作一样直接使用memmap时,内存映射将不考虑元数据存储位置的文件头。要创建NPY文件的内存映射 View ,可以使用mmap_modenp.load选项。

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

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]])

使用带选项memmapnp.load创建一个mmap_mode='r':
In [7]: a3 = np.load('a.npy', mmap_mode='r')

In [8]: a3
Out[8]:
memmap([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])

关于Python内存映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27400594/

10-11 22:48