「每日分享」內存文件映射方式讀取超大文件踩坑題解析

我在這裡,等風也等你

使用內存文件映射 MappedByteBuffer 讀超大文件會有什麼問題嗎?

這種方式存在一個致命問題就是依然沒法讀取超大文件(大於 Integer.MAX_VALUE),因為 FileChannel 的 map 方法中 size 參數會有大小限制,源碼中發現該參數值大於 Integer.MAX_VALUE 時會直接拋出 IllegalArgumentException("Size exceeds Integer.MAX_VALUE") 異常,所以對於特別大的文件其依然不適合。

本質上是由於 java.nio.MappedByteBuffer 直接繼承自 java.nio.ByteBuffer ,而ByteBuffer 的索引是 int 類型的,所以 MappedByteBuffer 也只能最大索引到 Integer.MAX_VALUE 的位置,所以 FileChannel 的 map 方法會做參數合法性檢查。

我們可以通過多個內存文件映射來解決這個問題,具體如下。

「每日分享」內存文件映射方式讀取超大文件踩坑題解析

「每日分享」內存文件映射方式讀取超大文件踩坑題解析

「每日分享」內存文件映射方式讀取超大文件踩坑題解析

「每日分享」內存文件映射方式讀取超大文件踩坑題解析

如上便是一種解決方案,其實質依然是分割。

想要源碼可以閱讀原文:https://mp.weixin.qq.com/s/JcnSOGKQlDgaTTFKZFbXnA?scene=25#wechat_redirect


分享到:


相關文章: