2014-01-17 62 views
2

我正在尋找最快的方式讀取文件 - 我不需要看到讀取字節,我只需要文件被完全讀取,以便它獲取OS文件緩存。最快的方式讀取文件到操作系統文件緩存

這是我在用的時刻(但它涉及到分配爲每個文件直接緩存)

FileInputStream f = new FileInputStream(file); 
    FileChannel ch = f.getChannel(); 
    ByteBuffer bb = ByteBuffer.allocateDirect((int)file.length()); 
    ch.read(bb); 
+3

你當前的實現是錯誤的 - 如果文件的大小是1G,你的緩衝區分配將失敗,而是分配一個合理大小爲X的緩衝區並在循環中讀取你的文件。 PS:爲什麼地球上你想要緩存中的文件?即使你加載它,也絕對不能保證它在你需要時仍然存在。 –

+0

是的,好點。我在我的代碼中糾正了它。我爲什麼要這樣做?因爲我有一個使用NIO通過套接字從DVD傳輸文件的Java庫。由於某些原因,從DVD傳輸時速度非常慢,但當文件位於Windows文件緩存中時速度非常快。所以,我的解決方案是讀取50 MB的文件,然後使用該庫傳輸它們(當我確定它們被緩存時)。 – Jacko

+1

好吧,總的時間(從DVD - >到緩存+從緩存 - >連接的另一端)仍然大致相同,因爲(因爲我不瞭解你)瓶頸是從DVD讀取。 –

回答

-2

感謝EJPs建議,我創建了自己的/ dev/null的文件通道:

RandomAccessFile racFile = new RandomAccessFile(file, "r"); 
    FileChannel ch = racFile.getChannel(); 
    ch.transferTo(0, fileLength, new WritableByteChannel(){ 

    @Override 
    public boolean isOpen() { 
     // TODO Auto-generated method stub 
     return true; 
    } 

    @Override 
    public void close() throws IOException { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public int write(ByteBuffer src) throws IOException { 
     // TODO Auto-generated method stub 
     int rem = src.remaining(); 
     return rem; 
    } 

    } 

    ); 
    racFile.close(); 

這提供了在我的基準測試中最快的解決方案。

+0

這不是我的建議。操作系統已經提供了這樣的設備。沒有必要編寫代碼來實現這一點,就像我在答案中所說的那樣。如果你這樣做,只需將數據複製到該設備。你不必自己創造。 – EJP

+0

是的,我必須發明自己的。你的建議沒有奏效。這是我能找到的最佳解決方案。 – Jacko

2

只要將它與cat,\nulcopy在Windows上覆制到/dev/null。根本不需要編寫任何代碼。

+0

謝謝,EJP。你的建議引發了爲我解決它的想法。但是,爲每個文件啓動一個進程對我來說似乎並不理想。 – Jacko

+0

@Jacko我沒有說每個文件的進程。這兩個程序都可以在每個調用中複製多個文件。 – EJP