gpt4 book ai didi

python - Numpy 内存映射数组分配的内存问题

转载 作者:太空宇宙 更新时间:2023-11-03 11:54:33 25 4
gpt4 key购买 nike

在下面的代码中:

@profile
def do():

import random
import numpy as np

image = np.memmap('image.np', mode='w+', dtype=np.float32, shape=(10000, 10000))

print("Before assignment")

x = random.uniform(1000, 9000)
y = random.uniform(1000, 9000)
imin = int(x) - 128
imax = int(x) + 128
jmin = int(y) - 128
jmax = int(y) + 128
data = np.random.random((256,256))
image[imin:imax, jmin:jmax] = image[imin:imax, jmin:jmax] + data

del x, y, imin, imax, jmin, jmax, data

print("After assignment")

do()

与第一个 print 语句结束时相比,第二个 print 语句使用的内存增加了 - 这是 memory_profiler 输出:

Line #    Mem usage    Increment   Line Contents
================================================
1 @profile
2 def do():
3 10.207 MB 0.000 MB
4 10.734 MB 0.527 MB import random
5 21.066 MB 10.332 MB import numpy as np
6
7 21.105 MB 0.039 MB image = np.memmap('image.np', mode='w+', dtype=np.float32, shape=(10000, 10000))
8
9 21.109 MB 0.004 MB print("Before assignment")
10
11 21.109 MB 0.000 MB x = random.uniform(1000, 9000)
12 21.109 MB 0.000 MB y = random.uniform(1000, 9000)
13 21.109 MB 0.000 MB imin = int(x) - 128
14 21.109 MB 0.000 MB imax = int(x) + 128
15 21.113 MB 0.004 MB jmin = int(y) - 128
16 21.113 MB 0.000 MB jmax = int(y) + 128
17 21.625 MB 0.512 MB data = np.random.random((256,256))
18 23.574 MB 1.949 MB image[imin:imax, jmin:jmax] = image[imin:imax, jmin:jmax] + data
19
20 23.574 MB 0.000 MB del x, y, imin, imax, jmin, jmax, data
21
22 23.574 MB 0.000 MB print("After assigment")

RAM 从 21.109Mb 增加到 23.574Mb。如果我将该代码块放入循环中,这会导致问题:

Line #    Mem usage    Increment   Line Contents
================================================
1 @profile
2 def do():
3 10.207 MB 0.000 MB
4 10.734 MB 0.527 MB import random
5 21.066 MB 10.332 MB import numpy as np
6
7 21.105 MB 0.039 MB image = np.memmap('image.np', mode='w+', dtype=np.float32, shape=(10000, 10000))
8
9 21.109 MB 0.004 MB print("Before assignment")
10
11 292.879 MB 271.770 MB for i in range(1000):
12
13 292.879 MB 0.000 MB x = random.uniform(1000, 9000)
14 292.879 MB 0.000 MB y = random.uniform(1000, 9000)
15 292.879 MB 0.000 MB imin = int(x) - 128
16 292.879 MB 0.000 MB imax = int(x) + 128
17 292.879 MB 0.000 MB jmin = int(y) - 128
18 292.879 MB 0.000 MB jmax = int(y) + 128
19 292.879 MB 0.000 MB data = np.random.random((256,256))
20 292.879 MB 0.000 MB image[imin:imax, jmin:jmax] = image[imin:imax, jmin:jmax] + data
21
22 292.879 MB 0.000 MB del x, y, imin, imax, jmin, jmax, data
23
24 292.879 MB 0.000 MB print("After assignment")

并且使用的 RAM 将在每次迭代时增加。有什么办法可以避免这个问题吗?是 Numpy 错误还是我做错了什么?

编辑:这是在 MacOS X 上,我看到 Python 2.7 和 3.2 以及 Numpy 1.6.2 及更高版本(包括开发版本)的问题。

编辑 2:我在 Linux 上也看到了这个问题。

最佳答案

我的猜测是 numpy 首先将数据写入缓冲区,然后才写入文件。可能是出于性能原因。

我做了一些测试,在你的分配行之后,文件 image.np 没有改变。该文件仅在我删除对象 image 或执行 image.flush() 后更改。如果内存是最重要的,您可以尝试将 image.flush() 放入循环中,看看它是否能解决问题。

关于python - Numpy 内存映射数组分配的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15473377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com