【问题标题】:Is there a limiltation of simultaneous filestreams?是否有同时文件流的限制?
【发布时间】:2013-07-04 14:47:21
【问题描述】:

我有一个策略问题要使用同时打开fstreams。 我必须编写一个读取大量文件的程序。在每个文件中都有一堆标识符的信息,但只有一次。我必须计算这些信息,然后将每个标识符的信息保存在单独的文件中。每个标识符出现在多个文件中,每次都应保存在同一个文件中(一个标识符多次)。 我预计会有数百个标识符,所以我怀疑我应该同时打开数百个文件流。

那么并发文件流有限制吗? 或者您是否提出了另一种方法?

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

谢谢

【问题讨论】:

    标签: c++ fstream


    【解决方案1】:

    任何事情最终都有一个限制。文件是由操作系统管理的完美示例,您必须查阅操作系统文档以了解具体限制。在 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,那么您就是黄金 :)。

    【讨论】:

    • 对于 Linux,在命令行中键入 ulimit -a 以找出您的限制。例如,我看到open files (-n) 8192,所以我的限制是8192 同时打开文件描述符(或ulimit -n 只看到没有有用文本的数字)。
    • 好的,谢谢!认为问比提供在实际程序中不起作用的简化测试更好;)
    • 啊,BoB 的答案也适用于 Mac。上面写着 256,并且有一对作为标准输入和输出。
    • 确实,运行程序会为我输出8190。加上stdinstdout==stderr 对吗?)我做到了8192
    • -1 没有任何标准、文档等的链接。
    【解决方案2】:

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

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

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

    【讨论】:

    • 重新“有多少”。我查看了“实施数量”附录,但没有看到任何相关内容。
    • @BoBTFish 感谢您的检查。
    【解决方案3】:
    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 文档似乎不支持此信息。这意味着这可能是不正确的。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 如果有限制,怎么可能没有限制?
      • 创建 fstream 不同于打开文件。 fstream 是标准库的“概念”。 std 库对您可以创建的 fstream 数量没有任何限制,也对您可以将“打开”调用到“同时”的 fstream 数量没有任何限制。当您尝试打开文件时(无论是通过 fstream 还是通过其他方式),您会向操作系统请求资源,该资源目前可能不可用。事实证明,操作系统可能会限制可用文件描述符的数量,因此任何打开超过给定数量文件的尝试都会失败。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 2016-03-19
      • 2016-11-16
      相关资源
      最近更新 更多