記憶體檔案對映方式讀取超大檔案踩坑題解析

2021-10-08 15:00:55 字數 1437 閱讀 1335

答:這種方式存在乙個致命問題就是依然沒法讀取超大檔案(大於 integer.max_value),因為 filechannel 的 map 方法中 size 引數會有大小限制,原始碼中發現該引數值大於 integer.max_value 時會直接丟擲 illegalargumentexception(「size exceeds integer.max_value」) 異常,所以對於特別大的檔案其依然不適合。

我們可以通過多個記憶體檔案對映來解決這個問題,具體如下。

private fileinputstream inputstream;

private filechannel filechannel;

private int buffercountindex = 0;

private int buffercount;

private int bytebuffersize;

private byte bytebuffer;

this.inputstream = new fileinputstream(filename);

this.filechannel = inputstream.getchannel();

long filesize = filechannel.size();

this.buffercount = (int) math.ceil((double) filesize / (double) integer.max_value);

this.bytebuffersize = bytebuffersize;

long prelength = 0;

long regionsize = integer.max_value;

for (int i = 0; i < buffercount; i++)

prelength += regionsize;}}

public synchronized int read()

int realsize = bytebuffersize;

if (limit - position < bytebuffersize)

bytebuffer = new byte[realsize];

//current fragment is end, goto next fragment start.

if (realsize < bytebuffersize && buffercountindex < buffercount)

return realsize;

}public void close() throws ioexception

bytebuffer = null;

}public synchronized byte getcurrentbytes()

}public class test

reader.close();

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

php 讀取超大檔案

php開發很多時候都要讀取大檔案,比如csv檔案 text檔案等。這些檔案如果很大,比如10個g。這時,直接一次性把所有的內容讀取到記憶體中計算不太現實。遇到這種情況,往往覺得php太弱,實則不然。利用生成器 關鍵字yield 就能解決。好了,上 created by phpstorm.user a...

Python chunk讀取超大檔案

16gb小水存已經不能適應動輒4gb 8gb的資料檔案了。查詢到pandas的read csv 提供了chunk分塊讀取能力。這是一張原始的table in 185 table pd.read csv tmp.sv sep in 186 table out 186 unnamed 0 0 1 2 3...

iOS將大檔案對映到記憶體 讀取大檔案

from 2012年10月23日 在 中國區gps偏移糾正 適用於google地圖 一文中曾讀取乙個78m的大資料檔案,一開始採用了nsdata的datawithcontentsoffile 方法。不少人反饋說如果直接使用,將會耗盡ios的記憶體。其實這個是可以改善的。nsdata還有乙個api i...