0

Spring ベースの Java Web アプリケーションがあります。そして私の問題は:

34MB で 270 万行のファイルがあります。行は、次から次へと続く単一の単語です。

abc
abcdfg
xyz
etc

このファイルから、隣接していない15 行のランダムな一意の行を非常に高速な方法で選択する必要があります。このような大きなファイルを検索するには、Apache Lucene を使用できることを知っています。Lucene がこれらのランダムな行を取得できるかどうか知っていますか? または、この問題を解決するのに役立つ他のアイデアがあるかもしれません。

何か助けていただければ幸いです

前もって感謝します

編集:

それとも、このファイルをデータベース [PostgreSQL] に入れるだけでしょうか?

4

2 に答える 2

1

Lucene は役に立ちません。

代わりに、乱数を生成し (乱数が隣り合っていないことを確認してください)、テキスト ファイルからそれらの行を読み取ります。

これを行うコードは次のとおりです。

  public static void main(String[] args) throws IOException
  {
    BufferedReader reader = new BufferedReader(new FileReader(
        "MyFile.txt"));
    try
    {
      final int MAX_NUM = <ENTER-YOUR-MAX-NUMBER-OF-LINES>;
      Set<Integer> randomLines = new HashSet<Integer>();
      Random rnd = new Random(System.currentTimeMillis());
      for (int i = 0; i < 15; i++)
      {
        int aNum = rnd.nextInt(MAX_NUM);
        // to make sure no lines next to each other...
        if (!randomLines.contains(aNum) && !randomLines.contains(aNum+1) && !randomLines.contains(aNum-1))
        {
          randomLines.add(aNum);
        }
      }
      List<String> result = new ArrayList<String>();
      String aLine;
      int lineNo = 0;
      while ((aLine = reader.readLine()) != null)
      {
        if (randomLines.contains(lineNo))
        {
          result.add(aLine);
        }
        lineNo++;
      }
      System.out.println("Result: " + result);
    }
    finally
    {
      reader.close();
    }
  }
于 2012-10-24T13:43:14.730 に答える
0

Mongo DBを使用することをお勧めします(RMDBSほど信頼性は高くありませんが、非常に高速です)。

http://www.mongodb.org/display/DOCS/Quickstart テキストファイルをMongoドキュメントに解析してから、Mongo dbからランダムな3つのドキュメントを取得すると、3つのランダムなフレーズが生成されます。

1)Javaの場合テキストファイルを読み取り、各行をmongoで個別のドキュメントとして保存するか、mongodirectのようにコマンドを実行します

> doc = { phrase : 'uniquephrase'}
> db.posts.insert(doc); 

2)Javaでmongoに接続し、コレクションサイズを取得し、そこからランダムな3つの数値を選択してから、3つのドキュメントを提供します...(またはその他)

于 2012-10-26T20:49:46.350 に答える