簡體   English   中英

java映射的FileChannel實現

[英]java mapped FileChannel implementation

使用Mapped FileChannel讀取文件似乎很快……但是我想知道他們是如何做到的?

他們只是在讀一個大(〜64kB)的緩沖區,然后讓我進入那個緩沖區嗎? 還是還有更多呢?

我對速度印象深刻,想更好地了解其背后的算法。

他們只有在您讀完之后才會閱讀任何東西,然后您基本上可以通過OS分頁系統閱讀您所閱讀的文章。 打開可能幾乎不會花費您什么,但重復讀取同一文件片段可能會導致重復的I / O。 沒有什么是免費的。

內存映射,將文件映射到您的內存中,並且Java提供了一個包裝它的庫,因此您可以相對安全地訪問它。

它的好處包括:

  • 內存,操作系統磁盤緩存和應用程序內存中只有一個副本。
  • 您無需系統調用即可訪問文件的隨機區域。
  • Java確實限制了可以映射的數量。即,如果最大堆為1 GB,最大直接內存為1 GB,則仍然可以映射為1 TB。

它的缺點包括:

  • 它會消耗虛擬內存,如果您重新映射或關閉文件,虛擬內存不會返回。 如果您使用的是64位JVM,那么這不是一個問題,但是如果您使用的32位JVM可能只有1 GB的可用空間,則不會有太大的限制。 GC運行時,它將釋放虛擬內存。
  • 它一次只能讀取/寫入至少一頁。 如果您具有大量隨機訪問權限,那么這可能會很好,但是如果您要從磁盤上讀取/寫入許多文件,則實際上會減慢順序訪問的速度。 一次隨機添加到多個文件,每個文件大小為4KB,可能會導致文件碎片過多,這是不可行的。
  • 與使用內存映射文件相比,使用純DataXxxxStream或BufferedReader / Writer可能更加困難。

我已經編寫了一些庫,使內存映射文件更易於使用,我想說的是,當超低延遲非常關鍵,或者您需要讀取大量的內存,而您希望這些內存已經存在於磁盤緩存中時,我會使用它。想要充分利用磁盤緩存。

值得注意的是,映射的內存並不能使您的磁盤子系統更快,如果這是您的限制因素,則用哪種方式讀取/寫入數據都無關緊要。

暫無
暫無

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

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