“打开的文件太多”使用boost :: filesystem获取目录内容时出错

时间:2012-01-19 17:58:07

标签: c++ boost

  

可能重复:
  General strategies for memory/speed problems

我有一个先前在General strategies for memory/speed problems中提到过的代码,它抛出了这个错误:

boost::filesystem::directory_iterator::construct: Too many open files

除了(貌似)占用了我所有的系统资源并减慢了我的程序。

我正在处理数百到数千个文件,并经常使用下面的代码调用以获取目录的内容。每个文件基本相同,整个程序中的内存应该很少 - 但是,程序的速度会迅速减慢到蜗牛的速度,之后会因上述错误而崩溃。

我猜测提升基本上所有目录都在内存中打开......但我不知道在哪里/如何等等。任何帮助或指针都会非常感激。谢谢!

static bool FileOps::getDirectoryContents(const string dirName, vector<string> *conts);

bool getDirectoryContents(const string dirName, vector<string> *conts) {
    path p(dirName);
    try {
        // Confirm Exists
        if(!exists(p)) {
            fprintf(stderr, "ERROR: '%s' does not exist!\n", dirName.c_str());
            return false;
        }

        // Confirm Directory
        if(!is_directory(p)) {
            return false;
        }

        conts->clear();

        // Store paths to sort later
        typedef vector<path> vec;
        vec v;

        copy(directory_iterator(p), directory_iterator(), back_inserter(v));

        sort(v.begin(), v.end()); 

        for(vec::const_iterator it(v.begin()), it_end(v.end()); it != it_end; ++it) {
            conts->push_back(it->string());
        }


    } catch(const filesystem_error& ex) {
        // THROWS ERROR: "boost::filesystem::directory_iterator::construct: Too many open files"
        fprintf(stderr, "ERROR: '%s'!\n", ex.what());
        return false;
    }   

    return true;
}

0 个答案:

没有答案