2

私の日常業務では、文字列の大規模なデータベースで計算を実行するためのコンピューター システムのセットアップを任されています。概念実証を確立しましたが、ハードウェアおよびソフトウェア環境を最適化するための低レベルの知識がありません。この点についてのガイダンスを期待していました。

設定:

  • 文字列を含むデータベース内の 100,000 レコード
  • 文字列類似度計算を実行して、おおよその重複を探します
    • つまり、各文字列が他のすべての文字列に対して行われるため、約 50 億回の計算が行われます
  • 1000サンプル行を使用してSQLite3をデータベースとしてRubyで概念実証を書きました
  • ジョブ全体は数日以内に実行されるはずです - 速いほど良いですが、収益は減少します. これは 1 回限りのパスなので、デスクトップ セットアップで数日以内に実行できる場合は、スーパーコンピューターは必要ありません。

私が探しているもの:

  • このジョブ (および同様の性質の潜在的な将来のジョブ) を実行するカスタム ボックスを構築している場合、どのハードウェアの最適化に重点を置く必要がありますか? つまり、限られた予算を非常に高速な GPU に費やすべきでしょうか? CPU?大量の RAM ? このタイプの操作のボトルネックがどこにあるかを知るのに十分なレベルの Ruby を知りません。
  • より良いアプローチがありませんか?ソフトウェアや高価なハードウェアの大規模な購入の承認は得られません。少なくとも、この方法がこのランスルーで機能することを証明できるまでは。しかし、誰かが不正確な重複を検出するより効率的な方法を提案できますか?
4

3 に答える 3

4

まず、最近では100,000の文字列は実際には大きなデータセットとして適格ではないため、ハードウェアについてあまり心配する必要はありません。これが私の以前の仕事(検索と機械翻訳に関連する)と現在の仕事からのいくつかの提案です。私は常に数十万から数百万のXMLレコードを扱っています。

  • RAMが必要です。それがたくさん。
  • Sorenが言ったように、あなたはあなたのアルゴリズムが良いことを確認したいです。
  • DBを賢く選択してください。たとえば、Postgresには優れた文字列関数があり、DBで直接特定のことを実行すると非常に高速になります。たくさんのRAMが欲しいと言ったことがありますか?
  • あなたの仕事は、並行して取り組むことができる小さなサブタスクに分割するのはかなり簡単だろうと思われます。その場合は、MapReduceを確認することをお勧めします。前の仕事では、オフにされたことのない非常に優れたワークステーション(4コア、8 GBのRAM)があったため、それらの一部を便利な機能を実行するHadoopクラスターに変換しました。とにかく日常の仕事で使うにはかなり圧倒されていたので、ユーザーは気づきさえしませんでした。通常、何かをMapReduceジョブに変換することはそれほど難しくありません。他の利点は、将来同様のタスクのセットアップを維持できることです。
  • Ruby固有のボトルネックに関しては、MRIで最大のものは通常、ガベージコレクションです。これは、その世界停止の性質のおかげで非常に低速です。プロファイルを作成すると、これが定期的に問題になることがわかります。Ruby GCの詳細については、理由の記事「完全に上向きのビン」を参照してください。Rubyを使用することになっている場合は、MRIをJRubyと比較することをお勧めします。後者と、JVisualVMのようなプロファイラーでの私の経験から、JRubyの方がうまくいったとしても驚かないでしょう。
于 2011-07-22T07:17:43.487 に答える
2

合計ジョブは数日以内に実行されるはずです...
これは1回限りのパスです...
もっと良いアプローチがありませんか...

これが 1 回限りのタスクである場合は、Amazon でこれを実行する必要があります。特大 (4 コア、15 GB RAM) マシンを数時間入手して、そこで実行するだけです。

于 2011-07-22T17:31:00.433 に答える
1

文字列の類似性のアルゴリズムは、ハードウェアの仕様よりもはるかに重要です。

文字列の類似性に関するアルゴリズムに関する重要な質問は、「文字列が類似していると予想されるのはいつですか?」ということです。部分文字列、スペルミス、音声学、入力ミスを考慮しますか。

このSO リンクでは、アルゴに関する素晴らしい議論が行われています。100,000 レコードは (私の世界では) 非常に小さなデータですが、実装を容易にするために、適切なアルゴリズムが得られたら、できるだけ多くの RAM を取得するようにしてください。Ruby で行うことは、パフォーマンスの観点からも最良の選択ではないかもしれません。

于 2011-07-22T05:30:03.763 に答える