何年にもわたって蓄積した約 600 GB の辞書があり、それらをクリーンアップして並べ替えることにしました。
まず第一に、各ファイルは平均して非常に大きく、サイズは 500MB から 9GB です。私がやりたいことの前提条件は、各辞書をソートすることです。私の最終目標は、すべての辞書ファイル内および全体で 重複する単語を完全に削除することです。
これは、私の辞書のほとんどがカテゴリ別に分類および整理されているためですが、重複が依然として存在することがよくあります。
Load file
Read each line and put into data structure
Sort and remove any and all duplicate
Load next file and repeat
Once all files are individually unique, compare against eachother and remove duplicates
辞書 D{1} から D{N} の場合:
1) D{1}からD{N}までを個別に並べ替えます。
2) D{i}内の各単語の一意性を確認します
3) D{i}の各単語について、D{i+1}からD{N}までのすべての単語をチェックします。最初にD{i}内で一意である場合、各単語を削除します。
- このアルゴリズムを改善するために、一種の「ハッシュ」を使用することを検討しています。リストがソートされるため、おそらく最初の 1 つか 2 つの文字のみをチェックすることによって行われます (たとえば、a、b などで始まる単語のハッシュ開始行の位置)。
4) 保存して終了します。
前の例 (ただし、はるかに小さい):
Dictionary 1 Dictionary 2 Dictionary 3
]a 0u3TGNdB 2 KLOCK
all avisskriveri 4BZ32nKEMiqEaT7z
ast chorion 4BZ5
astn chowders bebotch
apiala chroma bebotch
apiales louts bebotch
avisskriveri lowlander chorion
avisskriverier namely PC-Based
avisskriverierne silking PC-Based
avisskriving underwater PC-Based
したがって、avisskriveri、chorion、bebotch、および PC-Based は、3 つの辞書のそれぞれの内外で繰り返される単語であることがわかります。したがって、最初にD{1}に avisskriveri が表示されるので、それが表示された他のすべてのインスタンスでそれを削除します。次に、D{2}に最初にコリオンが表示され、他のすべてのインスタンスで最初に削除されます。D{3}ではbebotch と PC-Based が複製されているため、1 つのエントリを除いてすべて削除したいと思います (以前に見たことがなければ)。次に、すべてのファイルを保存して閉じます。
後の例:
Dictionary 1 Dictionary 2 Dictionary 3
]a 0u3TGNdB 2 KLOCK
all chorion 4BZ32nKEMiqEaT7z
ast chowders 4BZ5
astn chroma bebotch
apiala louts PC-Based
apiales lowlander
avisskriveri namely
avisskriverier silking
avisskriverierne underwater
avisskriving
覚えておいてください:私は新しい辞書を作成したくありません.すべての辞書から重複を削除するだけです.
オプション:
各ファイルの一意の単語の量を「ハッシュ」して、プログラムが計算時間を見積もることができるようにします。
目的の最初の文字で始まる最初の単語の位置を指定する方法を指定します。検索が行に「ジャンプ」して、不必要な計算時間をスキップできるようにします。
高性能並列計算のために GPU で実行します。(GPU からデータを取得するのは難しいため、これは問題です)
目標:計算時間とスペースの消費を削減して、機能が制限された標準的なマシンまたはサーバーでこの方法を手頃な価格で利用できるようにします。または、GPU クラスターでリモートで実行する方法を考案します。
tl;dr - 各ファイルのサイズが 1 ~ 9GB の数百のファイル間で一意の単語を並べ替えます。