我对使用同时打开的fstream
提出了一个战略性问题。
我必须编写一个程序,它也读取了大量文件。在每个文件中都有一堆标识符的信息,但有一次。我必须计算此信息,而不是将其保存在单独的文件中。每个标识符都出现在多个文件中,每次都应保存在同一个文件中(一次标识符多次)。
我希望有几百个标识符,所以我怀疑我应该同时打开几百个文件组。
同步文件流有限制吗? 或者你提出另一种方法吗?
该程序将计算大量数据(大约10GB或更大),并可能计算几个小时。
由于
答案 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)
2^(8*sizeof(filehandle))
个不同文件。 filehandle是用于访问文件内容的类型。 HANDLE,FILE *,int等取决于操作系统。但是,在达到此限制之前,您可能会耗尽内存。