c++ - 如何高效地写入大量文件

标签 c++ io gzip zlib

我正在尝试编写一个程序,根据每个序列的特定片段内的值将大量基因序列分成许多文件。例如序列可能看起来像

AGCATGAGAG...
GATCAGGTAA...
GATGCGATAG...
... 100 million more

目标是根据从位置 2 到 7(6 个碱基)的序列将读取拆分为单独的文件。所以我们得到类似的东西

AAAAAA.txt.gz
AAAAAC.txt.gz
AAAAAG.txt.gz
...4000 more

现在我天真地实现了一个 C++ 程序

  • 读取每个序列
  • 打开相关文件
  • 按顺序写
  • 关闭文件

有点像

#include <zlib.h>

void main() {
    SeqFile seq_file("input.txt.gz");
    string read;

    while (read = seq_file.get_read) {
        string tag = read.substr(1, 6);
        output_path = tag + "txt.gx";

        gzFile output = gzopen(output_path.c_str(), "wa");
        gzprintf(output, "%s", read);
        gzclose(output);
    }
}

与仅将全部内容写入单个其他文件相比,这慢得令人无法忍受。

这种情况的瓶颈是什么?考虑到由于系统限制我无法同时打开所有文件,我该如何提高性能?

最佳答案

由于打开文件很慢,您需要减少打开文件的数量。实现此目的的一种方法是对您的输入进行多次传递。打开输出文件的一个子集,传递输入并只将数据写入这些文件。完成后,关闭所有这些文件,重置输入,打开一个新的子集,然后重复。

关于c++ - 如何高效地写入大量文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48514709/

相关文章:

java - tomcat中的io处理

c++ - UDP Tx 循环每次在正好 3970 个数据包时停止工作,在我 friend 的计算机上为 14386

c++ - int * array = new int [size](); 的有效性

c++ - 在代码(.c 文件)中我如何找到 linux 发行版名称版本

c++ - 在 C++ 中使用 &

c++ - 记录标准输入和标准输出

java - 从Java中的文本文件中读取不同的变量

gzip - 如何从 Elixir 代码写入 gzip 文件

r - 从数据帧写入 gzip 文件

linux - gxip -c 是如何工作的