3

次のようなデータフィールドエントリを含むファイル(dictionary.txt)があります-

    ABC This represents ...
    PQR This represents ...
    XYZ This represents ...
    ...
    ...
    ... (hundreds of such entries)

次の関数を持つSearcher.javaというJavaプログラムがあります

private String[] searchInsideFile(String stringToMatch, String fileName)

これにより、stringToMatchに含まれているファイル内のデータフィールドの出現が検索されます。ただし、この関数は、現状では、ファイルを毎回開いたり閉じたりして、数百のフィールドすべてを読み取って一致するものを探します。

この関数を何度も(おそらく数百回)呼び出す必要があるため、私が行っていることはかなり効率的ではないと思います。そのような状況に適した「デザインパターン」はありますか?ありがとう。

4

5 に答える 5

3

可能であれば、ファイルの内容全体をメモリ内にプリロードし、属性として定義されたデータ構造を使用してインデックスを作成する必要がありますMap。次に、メソッドsearchInsideFileはデータ構造の内部を調べ、ファイルを完全にロードしないようにする必要があります。

于 2012-04-04T14:05:11.670 に答える
2

最速の解決策は、ファイルを1回読み取り、それをメモリに保持することです。しかし、これは大きなファイルでない場合にのみ有効です。ファイルが大きすぎるか、将来大きくなりすぎる可能性がある場合は、ファイル全体を検索する必要があるため、ディスクから毎回読み取る必要があります。この場合、ランダムアクセスは実際には役に立ちません。

于 2012-04-04T14:05:28.517 に答える
1

ファイルが大きすぎず、変更されない場合は、起動時にその内容を文字列に読み込んでから、その上で検索を行うことができます。

于 2012-04-04T14:15:25.507 に答える
1

ConstantDataManagerパターンを使用します。基本的な考え方は、プログラムを起動すると、オブジェクトが使用しているファイルからすべての情報をベクターとして、または(マップなど)保存したいファイルから抽出するため、オーバーヘッドが発生するということです。

次に、データのストアでバイナリ検索(辞書に単語が順番に格納されていると仮定)を実行できます。必要に応じて、オブジェクトにsaveメソッドを設定して、コンテンツをファイルに更新することもできます。

見るのに良い本は「Javaのソフトウェアアーキテクチャデザインパターン-ParthaKuchana」です。72時間見るか購入する必要がありますが、この本の関連する章へのリンクがあります。おそらく、任意のライブラリまたはその他のソースから入手できます... http://www.crcnetbase.com/doi/pdf/10.1201/9780203496213.ch7

また、MYSQLデータベースを使用することを考えましたか?これにより、辞書に多数のエントリがある場合、これが少し速くなる可能性があります。

これがお役に立てば幸いです、-ベン

于 2012-04-04T14:33:42.550 に答える
0

おそらく、Searcherクラスのファイルをインスタンス変数として持ってから、ファイルを開く別の関数を作成します。次に、searchInsideFile()関数を変更して、以前に開いたファイルにアクセスします。後でファイルを閉じることを忘れないでください!

于 2012-04-04T14:05:02.433 に答える