[英]How to read huge file in Java, in chunks without being blocked?
假設你有一個更大的文件然后你有內存來處理。 您希望輪流讀取n
個字節的文件, 並且不會在此過程中被阻止
我嘗試了不同的事情並取得了不同的成功,但阻塞似乎總是存在問題。
請提供一個獲取訪問權限的非阻塞方式示例,例如byte[]
你不能。
在等待磁盤為您提供數據時,您將始終阻止。 如果您對每個數據塊有很多工作要做,那么使用第二個線程可能有所幫助:該線程可以對數據執行CPU密集型工作,而第一個線程被阻塞,等待下一次讀取完成。
但這聽起來不像你的情況。
您最好的選擇是盡可能大地讀取數據(例如,1MB或更多)。 這最小化了內核中阻塞的時間,並且可能導致等待磁盤的時間更少(如果正在讀取的塊恰好是連續的)。
這是代碼
ExecutorService exec = Executors.newFixedThreadPool(1);
// use RandomAccessFile because it supports readFully()
RandomAccessFile in = new RandomAccessFile("myfile.dat", "r");
in.seek(0L);
while (in.getFilePointer() < in.length())
{
int readSize = (int)Math.min(1000000, in.length() - in.getFilePointer());
final byte[] data = new byte[readSize];
in.readFully(data);
exec.execute(new Runnable()
{
public void run()
{
// do something with data
}
});
}
聽起來你正在尋找Streams,緩沖或兩者的某種組合(BufferedInputStream任何人?)。
看看這個: http : //docs.oracle.com/javase/tutorial/essential/io/buffers.html
這是處理非常大的文件的標准方法。 如果這不是你想要的,我道歉,但希望無論如何它都會幫助讓人流淌。
祝好運!
如果你有一個執行I / O和CPU計算的程序,如果平均處理一個字節所花費的CPU時間少於讀取一個字節的時間,則阻塞是不可避免的(程序中的某個地方)。
如果您嘗試讀取文件並且需要磁盤搜索,則數據可能不會達到10毫秒。 在這段時間內,2 GHz CPU可以完成20 M個時鍾周期的工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.