是否存在同时文件流的限制?

时间:2013-07-04 14:47:22

标签: c++ fstream

我对使用同时打开的fstream提出了一个战略性问题。 我必须编写一个程序,它也读取了大量文件。在每个文件中都有一堆标识符的信息,但有一次。我必须计算此信息,而不是将其保存在单独的文件中。每个标识符都出现在多个文件中,每次都应保存在同一个文件中(一次标识符多次)。 我希望有几百个标识符,所以我怀疑我应该同时打开几百个文件组。

同步文件流有限制吗? 或者你提出另一种方法吗?

该程序将计算大量数据(大约10GB或更大),并可能计算几个小时。

由于

4 个答案:

答案 0 :(得分:6)

最终对任何事情都有限制。文件是操作系统管理的完美示例,您必须查阅操作系统文档以了解具体限制。在Linux中,我相信它在内核中是可配置的。可能还有用户和流程配额。

我不认为200太多了。

尝试看看很简单。只需编写一个程序,在发生错误之前不断打开更多文件。

实例。

在Mac OS X 10.8上,此程序

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>

int main() {
    int i = 0;
    std::ofstream *f;
    do {
        f = new std::ofstream( std::to_string( i ++ ) );
    } while ( * f << "hello" << std::flush );
    -- i; // Don't count last iteration, which failed to open anything.

    std::cout << i << '\n';
}

生成输出253。所以如果你在Mac上,你就是金色的。:)

答案 1 :(得分:1)

C ++标准没有定义您可以同时打开的文件数量(或者我相信但是我没看过的数量)的限制。

C ++库的特定实现可能有一个限制(可能会或可能不会记录)。操作系统很可能对整个系统有一些限制,每个进程有另一个限制。这些限制会有所不同,所以没有简单的说法。并且它们也可能被系统所有者配置的各种设置人为地降低。

即使您知道所有这些限制是什么,也可能存在根据具体情况而变化的动态限制 - 例如,如果整个系统允许打开16384个文件,则每个进程限制为1000,并且C ++库允许1024,您可能无法打开单个文件,因为操作系统没有可用于分配某些关键数据块的内存。

答案 2 :(得分:0)

您可以同时打开的fstream没有限制,但是,您的操作系统限制了可以同时打开的文件数。虽然对于一般的操作系统似乎有几百个文件似乎不太多,但我建议你事先阅读所有信息(可能一次打开几个文件,但考虑到“打开”调用失败的可能性,在这种情况下,您应该在关闭一些先前打开的文件后再试一次)然后进行处理并将结果存储在某些内部数据结构中。最后,您可以再次以并行方式将结果写回文件,但同样,准备尝试打开文件失败。

答案 3 :(得分:0)

  1. Os可以对同时打开的文件数施加限制。类Unix系统(linux,* bsd等)肯定有这个限制,它是可配置的,windows可能有类似的可配置限制
  2. 在任何操作系统上,您将无法打开超过2^(8*sizeof(filehandle))个不同文件。 filehandle是用于访问文件内容的类型。 HANDLE,FILE *,int等取决于操作系统。但是,在达到此限制之前,您可能会耗尽内存。
  3. 在Windows C运行时库(stdio,提供fprintf和类似功能的文件)上,一次可以打开不超过512个文件,这个数字最多可以增加到2048,但不能再增加。参见_setmaxstdio。因此,如果fstream在引擎盖下使用cstdio,则相同的限制将适用于fstream。
  4. SAY 表示在32个windows xp上一个进程无法打开超过65535个文件。然而,这些信息是传闻,似乎没有msdn文档支持。这意味着这可能不正确。