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