1

これをJavaで実装しています。

Symbol file     Store data file

1\item1         10\storename1
10\item20       15\storename6
11\item6        15\storename9
15\item14       1\storename250
5\item5         1\storename15

ユーザーはワイルドカードを使用して店舗名をstorename? 検索します。私の仕事は店舗名を検索し、シンボル データを使用して完全な文字列を生成することです。例えば:

item20-店名1 item14-
店名6 item14-
店名9

私のアプローチは次のとおりです。

  1. ストア データ ファイルを 1 行ずつ読み取る
  2. いずれかの行に一致する検索文字列 ( などstorename?) が含まれている場合、その行を中間ストア結果ファイルにプッシュします
  3. また、一致するストア名の itemno を配列リスト (10,15 など) にコピーします。
  4. この arraylist size%100==0 の場合、ハッシュセットを使用して重複する項目番号を削除し、arraylist のサイズを大幅に削減します
  5. arraylist サイズ >1000 の場合

    1. を使用してそのリストを並べ替えますCollections.sort(itemno_arraylist)
    2. シンボル ファイルを開き、1 行ずつ読み取りを開始する
    3. 行ごとにCollections.binarySearch(itemno_arraylist,itmeno)
    4. 一致する場合は、結果を中間シンボル結果ファイルにプッシュします
  6. step1をストアデータファイルのEOFまで続ける

...

このすべての後、2 つの結果ファイル (シンボル結果ファイルとストア結果ファイル) を組み合わせて、実際の文字列リストを表示します。

このアプローチは機能していますが、より多くの CPU 時間とメイン メモリを消費しています。

CPU時間(現在2分)とメモリ(現在80MB)を削減した、より良い解決策を知りたいです。Java で使用できるコレクション クラスは多数あります。この種の巨大な文字列処理の問題に対して、より効率的な解決策を提供するのはどれですか?

この種の文字列処理の問題について何か考えがある場合は、Java でもそれが役に立ちます。

注: どちらのファイルも 100 万行近くの長さになります。

4

4 に答える 4

1

シンボルファイルに10\storename1は. 明白な解決策は、シンボル ファイルをマップにロードすることです。item20-storename110\item20

String tokens=symbolFile.readLine().split("\\");
map.put(tokens[0], tokens[1]);

次に、ストア ファイルを 1 行ずつ読み取り、次のように置き換えます。

String tokens=storelFile.readLine().split("\\");
output.println(map.get(tokens[0])+'-'+tokens[1]));

これは最も高速な方法ですが、マップに多くのメモリを使用します。マップをデータベースに格納するメモリを削減できますが、時間が大幅に増加します。

于 2012-10-21T07:18:38.273 に答える
0

マップの使用に制限はありますか?マップにアイテムを追加して、簡単に検索できますか?100万レコードは1M*recordSizeを意味するため、問題はありません。

   Map<Integer,Item> itemMap= new HashMap();
   ...
   Item item= itemMap.get(store.getItemNo());

ただし、最善の解決策はデータベースを使用することです。

于 2012-10-21T07:10:31.613 に答える