2017-04-02 44 views
2

我有一個商店,如以下使用FREAD有效地讀取數據稀疏

A1 B1 C1 ... A2 B2 C2 ... .... An Bn Cn ... 

數據的文件在這裏艾,Bi和詞與16個字節的塊。每個塊Ai Bi Ci ...可能大於1M,n可能是256.我想依次讀A1,A2 ... An,然後B1,B2 ... Bn ...

如果我使用fread A1,fseek到A2,fread A2,...,我猜測它浪費了很多IO帶寬。 fread可以在每次調用時從磁盤讀取4k字節,在執行完fseek之後,最後一個fread的緩存數據可能會丟失。讀取完所有的As後,讀取B1需要直接從磁盤讀取,而不是緩存。

這個假設是否正確?我不確定文件系統是否可以很智能,並且仍然使用B1來保存緩存。如果文件系統無法幫助解決這個問題,我可能不得不將myfread作爲fread的包裝器,但將256 * 4k數據緩存在我自己的緩衝區中,因此下一輪讀取Bs可以更快。 myfread從緩衝區中讀取,直到它達到4k,然後它需要fread真實的數據。但我知道fread不是一個簡單的API,myfread可以是一個簡單的實現嗎?我需要考慮文件系統的一致性嗎?就我而言,我知道沒有人在閱讀時寫下這些文件。

回答

1

它不只是文件系統,它的hdd/ssd也會緩存。此外,Linux將使用任何備用RAM來緩存儘可能多的文件系統,只有在程序分配內存時纔會將其拋棄(我不知道如何選擇緩存的內容)。

大多數東西都會緩存塊,並將未使用的數據替換爲程序正在使用的數據,或者接近已使用的數據。您的稀疏訪問對於緩存來說將會很難。

要考慮兩種選擇 - 要麼1)將整個文件讀入一個單獨的數據塊中,稍後再進行細分(現在RAM中的256MB數據沒有任何用處,只需查看Web瀏覽器的內存消耗情況,豬),或2)設置一個RAM驅動器並在使用之前將文件複製到它。

2)更容易,沒什麼會更快然後1)

相關問題