我对使用同时打开fstream
的 s 有一个战略问题。我必须编写一个读取大量文件的程序。在每个文件中都有一堆标识符的信息,但只有一次。我必须计算这些信息,然后将每个标识符的信息保存在单独的文件中。每个标识符出现在多个文件中,每次都应保存在同一个文件中(一个标识符多次)。我希望有数百个标识符,所以我怀疑我应该同时打开数百个文件流。
那么同时文件流有限制吗?还是您提出另一种方法?
该程序将计算大量数据(大约 10GB 或更大),并且可能计算几个小时。
谢谢
任何事情最终都有一个限度。文件是由操作系统管理的完美示例,您必须查阅操作系统文档以了解具体限制。在 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,您可能无法打开单个文件,因为操作系统没有可用内存来分配一些关键数据块。
2^(8*sizeof(filehandle))
不同的文件。filehandle 是一种用于访问文件内容的类型。HANDLE、FILE*、int 等。取决于操作系统。不过,在达到此限制之前,您可能会耗尽内存。您可以同时打开的 fstream 没有限制,但是,您的操作系统限制了可以同时打开的文件数。虽然数百个文件对于一般操作系统来说似乎并不算多,但我建议您事先阅读所有信息(可能一次打开多个文件,但考虑到调用“打开”失败的可能性,在这种情况下,您应该在关闭一些以前打开的文件后重试)然后进行处理并将结果存储在某个内部数据结构中。最后,您可以再次以并行方式将结果写回文件,但再次准备好尝试打开文件失败。