2017-08-08 171 views
0

我試圖尋找的268萬個字的列表。這個想法是檢查用戶輸入的單詞是否存在於該列表中。我已經用一個簡單的I/O流完成了這個工作,但是搜索需要5秒鐘,這個時間太長了。我的文件目前位於資產。我尋找更有效的方式來搜索我的文件,並且我遇到了內存映射緩衝區。但是,我也不清楚,我應該存儲在下面的例子中我的文件:內存映射文件的位置

import java.io.File; 
    import java.io.IOException; 
    import java.io.RandomAccessFile; 
    import java.nio.MappedByteBuffer; 
    import java.nio.channels.FileChannel; 

    public class ReadFiles { 
     private static String largeFile = "sowpods.txt"; 

     public static void read() throws IOException { 
      File file = new File(largeFile); 
      FileChannel fileChannel = new 
      RandomAccessFile(file,"r").getChannel(); 
      MappedByteBuffer buffer = fileChannel.map(
      FileChannel.MapMode.READ_ONLY, 0, fileChannel.size()); 
      System.out.println(buffer.isLoaded()); 
      System.out.println(buffer.capacity()); 
     } 
    } 

如果我離開它的資產,我從它如何看?目前,我收到「sowpods.txt:打開失敗:ENOENT(沒有這樣的文件或目錄)」錯誤消息。感謝您的任何提示!

+0

如果要加載的文件是/資產不會路徑是「資產/ sowpods.txt」? – mcw

+0

不幸的是,它不能以這種方式訪問​​。但是,非常感謝。 –

回答

0

使用內存映射文件是這裏的壞主意。你本質上是在浪費OS資源,它無論如何不會讓你獲得最好的速度。

如果你只在同時執行一次搜索,你要保持它的簡單,不想讓文件在內存中搜索之間,用的BufferedInputStream去。給它一個緩衝區,比如說10 kB,它應該執行得相當快,而且很可能會讓磁盤飽和。

如果你執行的是大量的搜索,儘量保持內容在內存中搜索之間。使用HashSet或TreeSet。如果您使用的是HashSet,請先給它足夠的桶。

如果這些都不適合你(即你的內存不足,你有數百萬字,仍然希望快速搜索),將這些單詞轉換爲一些SQL數據庫,將數據放在一個表中並將其編入索引。這實際上是數據庫擅長的。您應該沒有問題找到適合您的目的的數據庫。

顯然,300K的話不是很多,應該存放在內存容易,地方約10 MB。根據您的使用場景,您可能還需要查看Bloom filter

+0

這非常有幫助,感謝您花時間解釋這一點! –