2017-08-08 9 views
0

268 000語のリストを検索しようとしています。アイデアは、ユーザーが入力した単語がそのリストに存在するかどうかを確認することです。私は単純なI/Oストリームを使ってこれを達成しましたが、検索には約5秒かかります。これは長すぎます。私のファイルは現在Assetsにあります。私はファイルを検索するためのより効率的な方法を探していました。私はMemory Mapped Bufferに出くわしました。私は、次の例では、私のファイルを保存する場所をしかし、それは私には明らかではない。メモリマップされたファイルの場所

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

ロードするファイルが/ assetsにある場合、パスは "assets/sowpods.txt"ではありませんか? – mcw

+0

残念ながら、この方法ではアクセスできません。しかし、同じことに感謝します。 –

答えて

0

メモリマップファイルを使用することは悪い考えです。あなたは基本的にOSリソースを浪費しており、とにかく最高のスピードを得ることはできません。

だけたまに検索を実行している場合、あなたはそれをシンプルに維持したいとBufferedInputStreamを一緒に行く、検索の間メモリ内のファイルを保持しません。例えば10 kBのバッファを用意してください。それはかなり速く実行され、ディスクを飽和させる可能性が最も高くなります。

多くの検索を実行する場合は、検索の間に内容をメモリに保存してください。 HashSetまたはTreeSetを使用します。 HashSetを使用している場合は、始めるために十分なバケットを与えてください。

メモリが不足していて、何百万語もの単語があり、高速検索が必要な場合は、単語をある種のSQLデータベースに変換し、そのデータを表に入れて索引付けします。これは実際にデータベースが優れているものです。あなたの目的に合ったデータベースを見つけるのに問題はありません。

どうやら、300K言葉がたくさんではない、それはどこかに10メガバイトの周りに、簡単にメモリに収まる必要があります。使用シナリオに応じて、Bloom filterを参照することもできます。

+0

これは非常に役に立ちます。時間を割いて説明してくれてありがとう! –

関連する問題