gpt4 book ai didi

在处理大型 numpy 数组时,Python 随机下降到 0% CPU 使用率,导致代码为 "hang up"?

转载 作者:太空狗 更新时间:2023-10-30 00:16:24 25 4
gpt4 key购买 nike

我一直在运行一些代码,其中一部分从二进制文件加载到一个大型一维 numpy 数组中,然后使用 numpy.where() 更改数组方法。

下面是代码中执行的操作示例:

import numpy as np
num = 2048
threshold = 0.5

with open(file, 'rb') as f:
arr = np.fromfile(f, dtype=np.float32, count=num**3)
arr *= threshold

arr = np.where(arr >= 1.0, 1.0, arr)
vol_avg = np.sum(arr)/(num**3)

# both arr and vol_avg needed later

我已经运行了很多次(在一台免费机器上,即没有其他抑制 CPU 或内存使用)没有问题。但最近我注意到有时代码会挂起很长时间,使运行时间延长一个数量级。在这些场合我一直在监控%CPU和内存使用率(使用gnome系统监视器),发现python的CPU使用率下降到0%。

在上述操作之间使用基本打印进行调试,对于哪个操作导致暂停似乎是任意的(即 open()、np.fromfile()、np.where() 分别导致挂起随机运行)。就好像我被随机限制了一样,因为在其他运行中没有挂起。

我考虑过垃圾回收或 this question 之类的事情,但我看不出与我的问题有任何明显的关系(例如击键无效)。

进一步说明:二进制文件为 32GB,机器(运行 Linux)有 256GB 内存。我正在通过 ssh session 远程运行此代码。

编辑:这可能是偶然的,但我注意到,如果我在机器刚刚重新启动后运行代码,则不会出现挂断。似乎它们在几次运行后或至少在系统的其他使用后开始发生。

最佳答案

np.where正在那里创建一个副本并将其分配回 arr。因此,我们可以通过避免复制步骤来优化那里的内存,就像这样 -

vol_avg = (np.sum(arr) - (arr[arr >=  1.0] - 1.0).sum())/(num**3)

我们正在使用 boolean-indexing 来选择大于 1.0 的元素并获取它们相对于 1.0 的偏移量并将它们相加从总和中减去。希望这种超出元素的数量更少,因此不会产生明显的内存需求。我假设大型阵列的挂起问题是基于内存的问题。

关于在处理大型 numpy 数组时,Python 随机下降到 0% CPU 使用率,导致代码为 "hang up"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41942960/

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