2

私は現在、数十万の文字列 (それぞれ最大 4000 文字) を処理し、これらの文字列に適用された関数の結果に基づいて簡単な操作を実行するアルゴリズムを開発しています。現在、Java と Mysql データベースを 1 つのテーブルで使用しています。

 ID | String | attribute a | attribute b | ....
    |        |             |             | ....

基本的に、アルゴリズムはまず 1 つの ID を取得し、格納されている文字列を読み取り、その文字列に対して機能を実行します (現在アクティブな列の属性が設定され、読み取られます)。たとえば、ある関数は文字列から ID を抽出し (単純な文字列解析)、この ID を「属性 a」列に格納します。エントリが解析されると、アルゴリズムは「属性 a」を読み取り、この ID を持つ行にジャンプし、プロセスが最初からやり直されます。

多分私はこれを少し考えすぎています。しかし、現在の設定にはオーバーヘッドが非常に大きいため、簡単な変更を行ったり、クエリをすばやくテストしたりすることはほとんど不可能です。このような大規模なデータセットを直接操作するために設計され、文字列操作のための効率的な機能を提供する、より優れたツールまたはプログラミング言語はありますか?

仕事に適したツールを使用することで時間を節約し、長期的にフラストレーションを防ぐことができると信じているため、まったく新しい言語の学習に時間を費やすことは絶対に気にしません.

4

3 に答える 3

3

私は何年もの間、オンとオフを問わず取り組んできたペットのプロジェクトを持っています。多数の文字列を格納します (テキストではありません)。過去に、Java インメモリ、データベースを使用した Scala、MySQL、C インメモリ、Python + Redis、そして最後に Go で実装しました。

Go は最高の仕事をしました。メモリ内のデータ構造に約 300,000 個の文字列 (ただし、あなたのものよりも短い) が格納されています。それらは、検索可能で分析可能なデータ構造を形成します。私の経験が関連するために、ユースケースはあなたのものと十分に似ていると確信しています。

Go は、データ処理に関して C と同様の効率性を備えています。迅速なコーディングのための Python のような優れた構文があります。... 型安全性のための型安全性があります。ガベージコレクションがあります。

私の提案は、Go を学び、すべてインメモリで行うことです。大規模なデータセットに対応するには、仮想メモリに依存します。私の場合、一度ロードすると RAM に約 500 MB ありますが、その 2 倍でも問題なく機能することは間違いありません。

必要がないので、ディスクに保存しません。入力ファイルから 15 分でデータ構造を再作成できます。アプリケーションは継続的に稼働するサーバーです。適切な分析を行うために大規模なバッチ操作を実行している場合。そうしないと、ディスクに簡単に永続化できると確信しています。

(FWIW www.folktunefinder.com メロディー検索インデックスについて話している)

于 2012-09-06T20:27:52.890 に答える
0

リレーショナル データベースは必要ないようです。MongoDBのようなものを試してみてください。

于 2012-09-06T20:20:53.897 に答える
0

これは本当に言語選択の問題ではないと思います.Javaで大きなデータ文字列をうまく処理できることは間違いありません. おそらく、次の方法でほとんどの問題を解決できます。

  • 制御されたデータのサブセットを使用して適切な JUnit テストを作成する
  • プロファイリングを行ってパフォーマンスのホットスポットを見つけ、それらを調整する
  • メモリ内の行/文字列のインテリジェントなキャッシュ (常にデータベースへのラウンドトリップを行うのではなく)

そうは言っても、この種のタスクの言語/環境としてClojureを選ぶことはほぼ間違いありません。

  • クエリなどをテストするための REPL でのインタラクティブな開発。
  • Javaよりはるかに簡潔
  • 遅延関数型プログラミングは、大きなデータ セット (メモリよりも大きいものであっても) に最適です。
  • すべての Java ライブラリに引き続きアクセスできます
  • Korma (SQL クエリ用の DSL) やDatomic (革新的な新しい種類のデータベース)などの非常に優れたデータベース ツール
于 2012-09-07T03:26:13.653 に答える