首页 > 解决方案 > 创建大量文件后,fopen 因 EFBIG“文件太大”而失败

问题描述

我正在创建一个基于一些输入创建小文件(8 kb)的程序,所以它是这样的

#include <iostream>
#incclude <string.h>
#include <errno.h>

void func()
{
    const char * file_name = NULL;
    // we get file_name from somewhere , ex : pic.png
    FILE * fp = fopen();
    if (fp == NULL)
    {
       std::cout << "failed to open file , " << strerror(errno) << std::endl ;
       return 0;
    }
     // some code to deal with the file
}

我创建了很多文件(大约 420 万个,我正在尝试测试性能),尽管我每次都在创建新的唯一文件,但它总是以相同的数量产生 EFBIG 错误(文件太大)。

这些文件是在 8 个线程中创建的。

关于解释的任何想法?

我想澄清一下,这显然不是确切的代码,但你可以认为这个函数在 8 个线程中以高频率运行,直到产生错误,从那时起,所有文件都会产生这个错误,直到程序完成

标签: c++linuxerror-handlingfilesystemslimit

解决方案


我实际上无法在任何地方找到针对 Linux 的文档,但由于您的文件数量显然已达到最大 32 位无符号整数 (4,294,967,295),听起来您的文件系统无法在单个目录中处理这么多文件。错误“太大”实际上是指目录,而不是您尝试打开的文件。

单个目录中的文件数量非常多。只需将它们分成不同的目录。

另外,请注意不要一次打开数以亿计的文件句柄;您的操作系统将对此设置限制(您可以使用 进行检查ulimit -a)。EMFILE但是,当您用尽此供应时,您应该得到。


推荐阅读