答:這種方式存在乙個致命問題就是依然沒法讀取超大檔案(大於 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...