编写大文本文件而不会使RAM过载

时间:2013-07-22 01:34:03

标签: c++ file-io

我需要在txt文件中写入进程的结果。这个过程很长,要写的数据量很大(~150Gb)。该程序工作正常,但问题是RAM过载,在某一点上,它只是停止。

程序很简单:

ostream f;
f.open(filePath);
for(int k=0; k<nDataset; k++){
    //treat element of dataset
    f << result;
}
f.close();

有没有办法在不重载内存的情况下编写此文件?

3 个答案:

答案 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();

基本上,您在内存中构造流而不是重定向到流,因此您不必担心流被刷新的时间。当您重定向时,确保将其刷新到实际文件中。可以从herehere找到OPTIMUM_BUFFER_SIZE的一些想法。

我不确定字符串或向量是否是缓冲区的最佳选择。我会自己做一些研究并更新答案,或者你可以参考Scott Meyers的 Effective STL

答案 2 :(得分:1)

如果真的是程序卡住的代码,那么你对问题的解释是错误的。

  • 没有文字文件。您的igzstream不是处理文字,而是处理gzip存档。

  • 没有写入数据。您显示的代码从流中读取

  • 我不知道你的程序用结果做了什么,因为你没有显示。但是如果它将结果累积到内存中的集合中,那么它将会增长。您需要找到一种方法来处理所有数据,而无需同时将所有数据加载到RAM中。

  • 您的内存使用量可能来自解压缩程序。对于某些压缩算法,整个块必须存储在内存中。在这种情况下,最好将文件分成块并单独压缩(可能使用前一个块的结果预先初始化字典)。但是,我不认为 gzip 是这样的算法。您可能需要找到支持流式传输的库。