簡體   English   中英

C ++:IO性能問題

[英]C++: IO performance issue

我在內存中有一個大數組。 我在文件中寫這個:

             FILE* fp = fopen("filename", "wb");
             fwrite(array, sizeof(uint32_t), 1500000000 , fp); // array saved
             fflush(fp) ;
             fclose(fp);

並使用以下方法再次閱讀:

              FILE* fp = fopen("filename", "rb");
              fread(array, sizeof(uint32_t), 1500000000 , fp);
              fclose(fp);

因為,寫作需要7秒,閱讀需要5秒。

實際上,我沒有寫整個數組。 我必須通過檢查一些條件來編寫和閱讀它。 喜歡(示例案例):

#include<iostream>
#include <stdint.h>
#include <cstdio>
#include <cstdlib>
#include <sstream>

using namespace std;

main()
{
      uint32_t* ele = new uint32_t [100] ;
      for(int i = 0; i < 100 ; i++ )
      ele[i] = i ;

      for(int i = 0; i < 100 ; i++ ){
          if(ele[i] < 20)
          continue ;
          else
          // write  ele[i] to file
          ;   
      }

 for(int i = 0; i < 100 ; i++ ){
          if(ele[i] < 20)
          continue ;
          else
          // read  number from file
          // ele[i] = number * 10 ;
          ;   
      }

     std::cin.get();
}

出於這個原因,我正在做的是:

寫作使用:

for(int i = 0; i < 1500000000 ; i++ ){
if (arrays[i] < 10000000)
continue ;
uint32_t number = arrays[i] ;
fwrite(&number, sizeof(uint32_t), 1, fp1);
}

閱讀使用: fread(&number, sizeof(uint32_t), 1, fp1);

這種情況:寫作需要2.13分鍾,閱讀需要1.05分鍾。

這對我來說是相當長的時間。 任何人都可以幫助我,為什么會發生這種情況(第二種情況下文件大小小於第一種)? 以及如何解決這個問題? 還有其他更好的方法?

剛剛對此進行了基准測試 ,在我的盒子上,許多小的fwrite()調用只能維持大約90 MB / s(磁盤比這快得多,因此測試不受磁盤限制)。

我的建議是進行自己的緩沖:將值寫入中間數組,並使用單個fwrite()不時地寫出整個數組。

只寫一次會更快。 我建議你只用你想打印的元素構建一個輔助數組,並在一個fwrite調用中寫這個數組。 當然這需要額外的內存,但這是標准的權衡 - 性能記憶。

盡管C的FILE *例程是緩沖的,但每次調用仍然有相當大的開銷 - 最終完成數百萬個整數大小的讀/寫操作會導致性能下降。

編輯:您是否正在進行整數大小的讀取作為速度優化的嘗試? 或者您是出於某些數據一致性原因而這樣做(即,如果條件為真,則只能更新數組中的整數)?

如果出於一致性原因,請考慮一次讀取一個塊(可能是4k或更大),然后從數據塊中進行比較和可能的更新 - 或者使用內存映射文件(如果它在目標平台上可用)( S)。

問題的標題是C ++,為什么不使用優秀的緩沖流設施呢? C ++ ofstream文件寫入是否使用緩沖區?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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