我正在处理大数据,并且矩阵的大小约为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_mode
的np.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]])
使用带选项
memmap
的np.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/