我需要在txt文件中写入进程的结果。这个过程很长,要写的数据量很大(~150Gb)。该程序工作正常,但问题是RAM过载,在某一点上,它只是停止。
程序很简单:
ostream f;
f.open(filePath);
for(int k=0; k<nDataset; k++){
//treat element of dataset
f << result;
}
f.close();
有没有办法在不重载内存的情况下编写此文件?
答案 0 :(得分:4)
您应定期清除输出。
例如:
if (k%10000 == 0) f.flush();
答案 1 :(得分:2)
我想建议这样的事情
ogzstream f;
f.open(filePath);
string s("");
for(int k=0; k<nDataset; k++){
//treat element of dataset
s.append(result);
if (s.length() == OPTIMUM_BUFFER_SIZE) {
f << s;
f.flush();
s.clear();
}
}
f << s;
f.flush();
f.close();
基本上,您在内存中构造流而不是重定向到流,因此您不必担心流被刷新的时间。当您重定向时,确保将其刷新到实际文件中。可以从here和here找到OPTIMUM_BUFFER_SIZE
的一些想法。
我不确定字符串或向量是否是缓冲区的最佳选择。我会自己做一些研究并更新答案,或者你可以参考Scott Meyers的 Effective STL 。
答案 2 :(得分:1)
如果真的是程序卡住的代码,那么你对问题的解释是错误的。
没有文字文件。您的igzstream
不是处理文字,而是处理gzip
存档。
没有写入数据。您显示的代码从流中读取。
我不知道你的程序用结果做了什么,因为你没有显示。但是如果它将结果累积到内存中的集合中,那么它将会增长。您需要找到一种方法来处理所有数据,而无需同时将所有数据加载到RAM中。
您的内存使用量可能来自解压缩程序。对于某些压缩算法,整个块必须存储在内存中。在这种情况下,最好将文件分成块并单独压缩(可能使用前一个块的结果预先初始化字典)。但是,我不认为 gzip 是这样的算法。您可能需要找到支持流式传输的库。