3

個人的な経験と制限などの理解の両方に関する質問です。たとえば、100,000 行 (エントリ) のテキスト ファイルと 100,000 の同一のエントリを含むデータベースがあり、それぞれに 1 つの単語が含まれ、ダブルはありません。より速く処理でき、メモリ消費が最も少ないのはどれですか?

テキストファイル全体を最初にリストにメモリにロードできることを理解しています(約1MBのみ)。この情報は、文字列の内容を確認するために使用されています。文字列内の (スペースで区切られた) すべての単語がファイルに存在する必要があります。存在しない場合、リスト内の最も類似したエントリに変更されます。一言で言えば、非常に高度なオートコレクトです。残念ながら、車輪の再発明をしなければなりません。

とにかく、私の質問はまだ残っています。私の最良の選択はどれですか?私は可能な限り最小限の外部モジュールを使用しようとしているので、SQLite に固執するかもしれないと考えています (それは標準ですよね? もう 1 つ害はありませんが) 改行区切りのテキスト ファイルが私の最速で最も経済的である場合オプション、それらを処理するための具体的な方法はありますか? Python などの言語で計算が可能であれば、このスクリプトで 1 秒間に少なくとも 100 回の一致操作を実行できるようにしたいと考えています。

4

2 に答える 2

1

免責事項: パフォーマンスの場合と同様に、仮定に頼るのではなく、測定してください。

そうは言っても、ここにいくつかの考慮事項があります:

  • データベースまたはプレーン テキスト ファイルのどちらを使用する場合でも、データ構造とアルゴリズムの選択がパフォーマンスに大きな影響を与える可能性があります。たとえば、リストを介した力ずくの検索は、いずれの場合も非効率的です。
  • 最適化されたメモリ内データ構造は、ディスク上のデータベースよりも高速である可能性があります。
  • 一方、データベース ソリューションは、より効果的にメモリを使用する場合があります。
于 2012-12-15T16:09:24.547 に答える
1

100,000 語すべてを Python セットにロードすると、特定の単語がそのセットに含まれているかどうかを判断するO(1)のに、それ以上の速さはありません。Python はすべてのデータをロードする必要があるため、Python アプリの起動時にペナルティが発生します。これは数秒程度です。

単語を SQLite (またはその他の SQL データベース) にロードする場合、同じ順序のパフォーマンスを実現するには、ハッシュ ベースのインデックスが必要になります。SQLite にそのインデックス タイプがあるかどうかはわかりません。MySQL はそうではありません。

通常、SQL データベースには「類似」語を検索する機能がありません。これは、すべてのユーザーが独自の「類似」の定義を持っているためです。Python で実装する方がはるかに簡単ですが、選択したデータベースには、まさに探しているものが含まれている可能性があります。

最適な選択は、言及していない他の要件によって異なります。100,000 語は頻繁に変更されますか? 他の人 (非プログラマー) は、それらを維持する必要がありますか? もしそうなら、データベースの方が便利かもしれませんし、スピードと引き換えにしたいかもしれません。また、どのくらいの頻度で Python アプリを起動しますか? 単一の単語をテストするために実行すると、単語ごとに数秒待機します。一方、デーモン/サーバーを作成してインターフェース (ソケット、HTTP など) を追加すると、データを 1 回ロードするだけで大​​量の単語を投げることができます。

于 2012-12-15T15:57:07.000 に答える