[英]Writing a single large data file, or multiple smaller files: Which is faster?
我正在开发将大量数据写入磁盘的c ++程序。 以下函数gzip压缩数据并将其写出到文件中。 压缩后的数据约为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();
}
该功能将数据写入字符串流,然后我写了一个文件( fastq_gz
使用升压转换器的) filtering_streambuf
。 该文件不是日志文件。 写入文件后,子进程将读取该文件。 该文件不需要人类查看。
目前,我正在将数据写到单个大文件( fastq_gz
)中。 这需要一段时间,而且文件系统(根据我们的系统经理)非常繁忙。 我想知道是否不应该写出多个较小的文件,而不是写出一个大文件? 这种方法会更快还是减少文件系统上的负载?
请注意,并不是压缩很慢-我已经进行了基准测试。
我在linux系统上运行,不需要考虑将实现推广到Windows文件系统。
因此,您的代码可能正在做的是(a)将文件生成到内存交换空间中,(b)从交换空间中加载并即时压缩,(c)在将压缩数据获取到外文件时写入压缩数据。
(b)和(c)很棒; (a)要杀了你。 这是两次未压缩数据的往返,其中之一与输出文件生成竞争。
我在boost iostream中找不到一个,但是您需要一个istream(源)或一台可以按需从您那里获取数据的设备。 一定有人写过(它似乎很有用),但是在看Boost iostreams文档的5分钟内我看不到它。
0.)设计一种算法,将数据分成多个文件,以便以后可以重新组合。 1.)将数据写入后台的单独线程中的多个文件中。 也许共享线程。 (也许一次启动n = 10个线程左右)。2.)查询共享对象的future属性,以检查是否已完成写入。 (大小> 1 GB)3.)出现上述情况; 然后在子进程查询时重新组合数据。4)我建议每隔1 GB写入一个新文件
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.