Python内存映射

laz*_*aza 7 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
Run Code Online (Sandbox Code Playgroud)

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

War*_*ser 18

NPY格式不仅仅是将数组的数据转储到文件中.它包含一个标头,其中包含定义数组数据类型和形状的元数据.memmap直接使用时,您的内存映射不会考虑存储元数据的文件头.要创建NPY文件的内存映射视图,可以使用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)
Run Code Online (Sandbox Code Playgroud)

请阅读np.load:

In [3]: a1 = np.load('a.npy')

In [4]: a1
Out[4]: 
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])
Run Code Online (Sandbox Code Playgroud)

使用以下方法错误地查看文件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]])
Run Code Online (Sandbox Code Playgroud)

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.]])
Run Code Online (Sandbox Code Playgroud)