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