python 循环赋值数组_python – Numpy内存映射数组赋值的内存问题

本文通过一个示例展示了在Python中使用Numpy的memmap进行数组赋值操作时,内存增加的问题。当将该操作放入循环中,内存消耗显著增大。讨论了可能的原因并寻求解决方案。
摘要由CSDN通过智能技术生成

在以下代码中:

@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 bug还是我做错了什么?

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值