我正在开发一个将大量数据写入磁盘的 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();
}
该函数将数据写入字符串流,然后我将其写入使用 boost 的 filtering_streambuf
写入文件 (fastq_gz
)。该文件不是日志文件。文件写入后它将由子进程读取。该文件不需要查看由人类。</p>
目前,我正在将数据写入单个大文件 (fastq_gz
)。这需要一段时间,而且根据我们的系统管理员的说法,文件系统非常繁忙。我想知道是否应该写出多个较小的文件,而不是写出单个大文件?这种方法会更快,还是会减少文件系统的负载?
请注意,速度慢的不是压缩 - 我已经进行了基准测试。
我在 Linux 系统上运行,不需要考虑将实现推广到 Windows 文件系统。
因此,您的代码可能正在执行的操作是(a)将文件生成到内存交换空间中,(b)从交换空间加载并动态压缩,(c)将压缩数据写入输出文件。
(b)和(c)很棒; (a) 会杀了你。这是未压缩数据的两次往返,其中一次与输出文件生成竞争。
我在 boost iostreams 中找不到,但您需要一个 istream(源)或一个可以按需从您那里获取数据的设备。一定有人写过它(看起来很有用),但我在查看 boost iostreams 文档 5 分钟后没有看到它。
我是一名优秀的程序员,十分优秀!