1

Python で n-gram カウントを実行しようとしていますが、MySQL (MySQLdb モジュール) を使用してテキスト データを整理できると考えました。

varchar一意の数値 ID (自動インクリメント) と言語フィールド (例: "en"、"de"、"es" など)によってインデックス付けされたドキュメントを表す、約 1000 万レコードのかなり大きなテーブルがあります。

select * from table遅すぎて、メモリが壊滅的です。ID 範囲全体を小さな範囲 (たとえば、それぞれ 2000 レコード幅) に分割し、次のようなクエリを使用して、これらの小さなレコード セットを 1 つずつ処理することになりました。

select * from table where id >= 1 and id <= 1999
select * from table where id >= 2000 and id <= 2999

等々...

MySQL でより効率的に実行し、大きなコーパス テキスト ファイルをシリアルに読み取るのと同様のパフォーマンスを達成する方法はありますか?

レコードの順序は気にしません。大きなテーブルで特定の言語に関連するすべてのドキュメントを処理できるようにしたいだけです。

4

3 に答える 3

1

HANDLER ステートメントを使用して、テーブル (またはインデックス) をチャンクでトラバースできます。これはあまり移植性が高くなく、見ている間に行が表示されたり消えたりする場合、トランザクションで「興味深い」方法で機能します (ヒント: 一貫性が得られません) が、一部のアプリケーションではコードが単純になります。

一般に、データベース サーバーがマシンに対してローカルである場合、データの複数のコピーとその他の処理が (メモリ内に) 必要になるため、パフォーマンス ヒットが発生します。これは避けられません。どうしても気になる場合は、この目的で mysql を使用しないでください。

于 2010-12-10T14:46:55.443 に答える
0

クエリをフィルタリングするために使用している列にインデックスを定義することを除けば(言語とID、おそらくIDにはすでに主キーのインデックスケアがあります)、いいえ。

于 2010-12-10T14:45:00.167 に答える
0

まず、必要な列 (この場合は lang と doc) を指定できる場合は、* の使用を避ける必要があります。第二に、データを頻繁に変更しない限り、特にファイル名を保存している場合は、これらすべてをデータベースに保存する意味がわかりません。たとえば、xml 形式を使用できます (SAX API を使用して読み書きできます)。

DB と MySQL よりも高速なものが必要な場合は、両方の Python バインディングを持つ SQLite や BerkeleyDb などのインメモリ データベースを検討できます。

グリーツ、J.

于 2010-12-10T15:17:10.220 に答える