【问题标题】:Python memory mappingPython内存映射
【发布时间】:2014-12-11 02:39:12
【问题描述】:

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

【问题讨论】:

  • 或者你可以使用blaze

标签: python numpy


【解决方案1】:

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

这是一个例子。首先,创建一个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]])

使用np.load 和选项mmap_mode='r' 创建memmap

In [7]: a3 = np.load('a.npy', mmap_mode='r')

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2018-04-03
    • 2013-09-02
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多