解决python数据加载中[Errno 24] Too many open files.问题

在复现论文过程中遇到数据格式转换问题,由于使用np.load()批量加载大量npz文件,导致[Errno24]TooManyOpenFiles错误。通过修改代码,对每个文件进行独立的加载和关闭操作,解决了问题但读取速度变慢。代码示例中展示了如何正确处理文件,避免打开过多文件。
部署运行你感兴趣的模型镜像

在复现论文的过程中遇到了数据格式不同的问题,需要自己把数据改成论文要求的格式。

自己是初学者,第一次遇到[Errno 24]Too many open files.查了很多资料,说是线程数不足的问题,实际上在我的代码中,只是数据加载不规范产生的问题。

问题的背景大概是:自己想通过np.load()批量加载npz文件(一个文件存了一个向量)并存入列表中(一个文件夹有800个npz,共70个文件夹),这时报错Too many open files.原因是打开了太多文件。查了一些资料后学习到,这种情况需要对每个文件执行load和close操作,而不能直接一次性全部暴力读取。代码片段如下:

npz_name_list = []
npz_data_list = []
for root, dirs, files in os.walk(npz_path):

    for name in files:
        npz_name = os.path.join(root, name)         #遍历获取每个文件路径
        with np.load(npz_name) as f:                #加载单个npz文件
            npz_data_list.append(f['feat'])         #把特征矩阵存入npz_data_list这个特征列表
        f.close()                                   #关闭文件。很重要,因为不关闭会遇到文件太多无法处理的情况
        npz_name_list.append(npz_name)              #文件路径存入路径列表

这样解决了报错,但同时读取的速度明显慢了很多。

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 解决 [Errno 24] Too many open files 错误 #### 修改文件描述符限制 Linux 操作系统默认设置了一个进程能够打开的最大文件数。当应用程序尝试超出此限制时,会抛出 `OSError: [Errno 24] Too many open files` 的异常。为了增加这一限制,可以通过编辑 `/etc/security/limits.conf` 文件来实现永久修改[^3]。 对于临时调整当前 shell session 中的 ulimit 设置,可以使用如下命令: ```bash ulimit -n 4096 ``` 这将把最大可打开文件数目提升到 4096。 #### 正确管理文件资源 另一个常见原因是由于程序逻辑不当造成大量未关闭的文件句柄累积。确保每次读取或写入文件之后都调用了相应的 close 方法非常重要。推荐做法是利用 Python 提供的上下文管理器 (`with` 语句),它可以在退出作用域时自动释放资源[^2]: ```python def read_file(file_path): try: with open(file_path, 'r') as f: data = f.read() return data except Exception as e: print(f"An error occurred while reading the file {e}") ``` 通过这种方式定义函数,在处理完毕后即使发生异常也能保证文件被正确关闭。 #### 调试现有应用 如果已经有一个运行的应用遇到了这个问题,则可能需要先找出哪些地方存在泄露的情况。可以借助第三方库如 `psutil` 来监控系统的状态并定位具体位置: ```python import psutil process = psutil.Process() print(process.open_files()) ``` 上述代码片段展示了如何获取当前进程中所有已打开文件的信息列表。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值