Python脚本读取.npy返回numpy数组时在return语句挂起求助
问题排查与解决方案
1. 先排除调试器干扰
VSCode调试器在返回大型numpy数组时,会尝试生成预览内容,这很可能导致程序卡住。先关闭调试模式,直接运行脚本,观察是否还会挂起。如果直接运行正常,那就是调试器的预览功能导致的,可在VSCode设置中禁用相关选项:
- 打开设置(快捷键
Ctrl+,) - 搜索
debug.inlineValues并取消勾选;或搜索python.debugger.showReturnValue,设置为false
2. 检查数组大小与内存占用
当label=0时,你需要同时返回四个numpy数组,如果这些数组体积过大,返回时会触发大量内存拷贝,导致程序无响应。可以在每个np.load后添加打印语句,查看数组的形状和内存占用:
label1 = np.load(f) print(f"label1 shape: {label1.shape}, 内存占用: {label1.nbytes / 1024 / 1024:.2f} MB")
如果单个数组超过数GB,或四个数组总内存远超机器可用内存,就会导致挂起。这种情况可考虑:
- 按需加载数组,避免一次性读取所有
- 改用
np.savez_compressed压缩存储数组
3. 代码优化与分步测试
你的代码存在大量重复逻辑,不利于排查问题。可以把读取逻辑封装成单独函数,逐个测试每个数组的返回是否正常:
def load_label_array(label_num): file_path = f'npys\\labels\\label{label_num}.npy' print(f'Opening Label {label_num} arrays..') with open(file_path, 'rb') as f: return np.load(f) # 先单独测试单个数组返回 test_arr = load_label_array(1) print(test_arr.shape) # 查看是否正常输出 # 再测试返回多个数组 arr1 = load_label_array(1) arr2 = load_label_array(2) print(arr1.shape, arr2.shape)
如果单独返回某个数组时就卡住,说明对应的.npy文件可能损坏,或加载后的数据存在异常。可以尝试重新生成该文件,或添加allow_pickle=False参数加载(如果文件未保存pickle对象):
np.load(f, allow_pickle=False)
4. 添加异常捕获排查文件读取问题
虽然你的代码看起来能正常读取文件,但可以添加异常捕获,确认每个文件是否真的加载成功:
import traceback if label == 0 or label == 1: print('Opening Label 1 arrays..') try: with open(f'npys\\labels\\label1.npy', 'rb') as f: label1 = np.load(f) print("Label1 加载成功") except Exception as e: print(f"Label1 加载失败: {e}") traceback.print_exc() if label == 1: return label1
内容的提问来源于stack exchange,提问作者asingh
相关产品推荐
相关产品推荐

