簡體   English   中英

寫入單個大數據文件或多個小文件:哪個更快?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM