繁体   English   中英

Python 在处理大型 numpy 数组时,CPU 使用率随机下降到 0%,导致代码“挂断”?

[英]Python randomly drops to 0% CPU usage, causing the code to “hang up”, when handling large numpy arrays?

我一直在运行一些代码,其中一部分从二进制文件加载到一个大型的一维 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() 分别导致随机运行挂起)。 就好像我被随机节流了一样,因为在其他运行中没有挂起。

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

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

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

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

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

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

CPU 使用率的下降与 python 或 numpy 无关,但确实是从共享磁盘读取的结果,而网络 I/O 才是真正的罪魁祸首。 对于如此大的数组,读入内存可能是一个主要瓶颈。

您是否单击或选择了控制台窗口? 这种行为可以“挂起”进程。 控制台进入“QuickEditMode”。 按任意键可以恢复该过程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM