我需要按順序讀取C++中的文件,每次處理4個字符(但它是一個滑動窗口,所以下一個字符與3之前一起處理)。我可以將文件塊讀入緩衝區(我知道mmap()
會更有效,但我想堅持平臺無關的純C++),或者我可以使用std::cin.read()
一次讀取文件。該文件可以是任意大的,因此讀取整個文件不是一個選項。C++ - 按順序高效地讀取文件
哪種方法更有效?
我需要按順序讀取C++中的文件,每次處理4個字符(但它是一個滑動窗口,所以下一個字符與3之前一起處理)。我可以將文件塊讀入緩衝區(我知道mmap()
會更有效,但我想堅持平臺無關的純C++),或者我可以使用std::cin.read()
一次讀取文件。該文件可以是任意大的,因此讀取整個文件不是一個選項。C++ - 按順序高效地讀取文件
哪種方法更有效?
最有效的方法是使用最少的函數調用或請求將大量數據讀入內存。
其目標是保持硬盤驅動器旋轉。其中一個瓶頸是等待硬盤轉速以正確速度。另一個是試圖找到你的請求數據所在的硬盤上的扇區。第三個瓶頸是與數據庫和內存的衝突。
所以我投read
方法進入緩衝區並搜索緩衝區。
確定您一次可以讀取的最大數據塊。然後通過塊讀取文件。
假設您一次只能處理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.
}
我以爲2k是2048字節,雖然我可能是錯的。 :-) –
@ThomasMatthews好眼睛:)錯誤已修復。 –
這比Rook指出的'std :: cin'的內置緩衝更有效嗎? – Xenopathic
std :: cin.read()的代碼完全有可能自己做緩衝,並且一次讀取多個字節。 'istream'規範的設計允許這樣的事情(另請參閱'readsome')。 – Rook
@我想過那個,但是不能保證緩衝區有多大,除此之外所有的調用都必須有很大的開銷嗎? – Xenopathic
它不應該花你很長時間來做一些分析;) – Rook