繁体   English   中英

是否存在同步文件流?

[英]Is there a limiltation of simultaneous filestreams?

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

那么同步文件流是否有限制? 还是您提出另一种方法?

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

谢谢

最终任何事物都有极限。 文件是由操作系统管理的文件的完美示例,并且您必须查阅OS文档以获取特定限制。 我相信在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,那么您会很高兴:)。

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

C ++库的特定实现可能有一个限制(可能会或可能不会有记录)。 操作系统很可能对整个系统有一些限制,而每个进程都有另一个限制。 这些限制是什么会有所变化,因此没有简单的方法可以说出来。 而且,系统所有者还可以通过各种设置来人为地降低它们。

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

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

  1. 操作系统可以限制同时打开的文件数。 类似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. 人们 ,在32 WINDOWS XP一个进程无法打开超过65535文件。 但是,此信息只是传闻,msdn文档似乎不支持此信息。 这意味着这可能是不正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM