[英]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.