我正在开发一个将大量数据写入磁盘的c ++程序。以下函数gzips数据并将其写入文件。压缩数据大约为100GB。压缩和写出数据的功能如下:
void constructSNVFastqData(string const& fname) {
ofstream fastq_gz(fname.c_str());
stringstream ss;
for (int64_t i = 0; i < snvId->size(); i++) {
consensus_pair &cns_pair = snvId->getPair(i);
string qual(cns_pair.non_mutated.size(), '!');
ss << "@" + cns_pair.mutated + "[" + to_string(cns_pair.left_ohang) +
";" + to_string(cns_pair.right_ohang) + "]\n"
+ cns_pair.non_mutated + "\n+\n" + qual + "\n";
}
boost::iostreams::filtering_streambuf<boost::iostreams::input> out;
out.push(boost::iostreams::gzip_compressor());
out.push(ss);
boost::iostreams::copy(out,fastq_gz);
fastq_gz.close();
}
该函数将数据写入字符串流,然后我
使用boost fastq_gz
写出文件(filtering_streambuf
)。
该文件不是日志文件。文件写完后
它将由子进程读取。该文件不需要查看
由人类。</ p>
目前,我正在将数据写入单个大文件(fastq_gz
)。这需要一段时间,文件系统 - 根据我们的系统管理员 - 非常繁忙。我想知道是否应该写出一些较小的文件,而不是写出一个大文件?这种方法会更快,还是减少文件系统的负载?
请注意,压缩不是很慢 - 我已经进行了基准测试。
我在linux系统上运行,不需要考虑将实现推广到Windows文件系统。
答案 0 :(得分:0)
所以你的代码可能正在做的是(a)将文件生成到内存交换空间,(b)从交换空间加载并动态压缩,(c)在将压缩数据输出到outfile时写入。 / p>
(b)和(c)很棒; (a)会杀了你。它是未压缩数据的两个roundmtrips,其中一个与输出文件生成竞争。
我在boost iostreams中找不到一个,但你需要一个istream(源代码)或一个可以根据需要从你那里获取数据的设备。有人必须写它(它看起来很有用),但是在5分钟内我看不到提升iostreams文档。
答案 1 :(得分:-2)
0。)设计一种算法将数据分成多个文件,以便以后重新组合。 1.)在后台的不同线程上将数据写入多个文件。也许共享线程。 (也许一次开始n = 10个线程) 2.)查询共享对象的future属性以检查写入是否完成。 (尺寸> 1 GB) 3.)一旦达到上述情况;然后在子进程查询时重新组合数据 4.)我建议每1 GB后写一个新文件