2014-05-15 57 views
1

我需要按順序讀取C++中的文件,每次處理4個字符(但它是一個滑動窗口,所以下一個字符與3之前一起處理)。我可以將文件塊讀入緩衝區(我知道mmap()會更有效,但我想堅持平臺無關的純C++),或者我可以使用std::cin.read()一次讀取文件。該文件可以是任意大的,因此讀取整個文件不是一個選項。C++ - 按順序高效地讀取文件

哪種方法更有效?

+0

std :: cin.read()的代碼完全有可能自己做緩衝,並且一次讀取多個字節。 'istream'規範的設計允許這樣的事情(另請參閱'readsome')。 – Rook

+0

@我想過那個,但是不能保證緩衝區有多大,除此之外所有的調用都必須有很大的開銷嗎? – Xenopathic

+0

它不應該花你很長時間來做一些分析;) – Rook

回答

2

最有效的方法是使用最少的函數調用或請求將大量數據讀入內存。

其目標是保持硬盤驅動器旋轉。其中一個瓶頸是等待硬盤轉速以正確速度。另一個是試圖找到你的請求數據所在的硬盤上的扇區。第三個瓶頸是與數據庫和內存的衝突。

所以我投read方法進入緩衝區並搜索緩衝區。

1

確定您一次可以讀取的最大數據塊。然後通過塊讀取文件。

假設您一次只能處理2K個字符。然後,使用:

std::ifstream if(filename); 
char chunk[2048]; 
while (if.read(chunk, 2048))) 
{ 
    std::streamsize nread = in.gcount(); 
    // Process nread number of characters of the chunk. 
} 
+1

我以爲2k是2048字節,雖然我可能是錯的。 :-) –

+0

@ThomasMatthews好眼睛:)錯誤已修復。 –

+0

這比Rook指出的'std :: cin'的內置緩衝更有效嗎? – Xenopathic