c++ - 创建大量文件后,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 个线程中以高频率运行,直到产生错误,从那时起,所有文件都会产生这个错误,直到程序完成
解决方案
我实际上无法在任何地方找到针对 Linux 的文档,但由于您的文件数量显然已达到最大 32 位无符号整数 (4,294,967,295),听起来您的文件系统无法在单个目录中处理这么多文件。错误“太大”实际上是指目录,而不是您尝试打开的文件。
单个目录中的文件数量非常多。只需将它们分成不同的目录。
另外,请注意不要一次打开数以亿计的文件句柄;您的操作系统将对此设置限制(您可以使用 进行检查ulimit -a
)。EMFILE
但是,当您用尽此供应时,您应该得到。
推荐阅读
- r - 乳胶 R 块输出未修饰
- python - 如何通过随机搜索优化 SVM 的权重?
- scala - Scala 调试这个递归示例
- ember.js - Ember JS:如何使用可组合的助手练习“Data Down,Actions Up”?
- java - Java 数组更改未触及的值
- bash - 如何使 Bash 脚本连续运行,并在我想要的时候结束它?
- emacs - 在 .emacs 中设置 Emacs 框架标题
- r - 使用 TM 包在 R TermDocumentMatrix 中查找自定义单词的频率
- mysql - Laravel 基于多对多关系获取项目
- actions-on-google - 在 actions-on-google Nodejs v2 中构建列表