簡體   English   中英

如何在沒有被阻止的情況下以塊的形式讀取Java中的大文件?

[英]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.

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