1

CSV 形式のデータが大量にあります。単一のテキスト フィールド (主キー) に基づいてこのデータをインデックス化できるようにする必要があるため、データベースに入力することを考えています。以前のプロジェクトで sqlite に精通していたので、そのエンジンを使用することにしました。

いくつかの実験の後、1 億件のレコードを 1 つのテーブルに保存するのはうまくいかないことに気付きました。この問題に対する 2 つの解決策を思い付くことができました。

  1. データをいくつかのテーブルに分割する
  2. データをいくつかのデータベースに分割する

私は2番目の解決策を採用しました(1つの巨大なファイルではなく、いくつかの大きなファイルが生成されます)。私のパーティション方法は、主キーの最初の 2 文字を調べることです。各パーティションには約 200 万のレコードがあり、約 50 のパーティションがあります。

私は sqlite3 モジュールを使用して Python でこれを行っています。プロセス全体を通して、50 の開いたデータベース接続と開いたカーソルを保持します。行ごとに、主キーの最初の 2 文字を確認し、辞書検索によって適切なカーソルを取得し、(カーソルで execute を呼び出して) 1 つの挿入ステートメントを実行します。

残念ながら、挿入速度はしばらくすると耐えられないレベルまで低下します (合計で約 1,000 万件の処理レコード)。これを回避するにはどうすればよいですか? 私がやっていることを行うためのより良い方法はありますか?

4

2 に答える 2

5
  • すべての挿入コマンドを 1 つのトランザクションにラップします。
  • 準備済みステートメントを使用します。
  • すべてのデータを挿入した後にのみインデックスを作成します (つまり、主キーを宣言しないでください)。
于 2013-07-24T06:13:06.637 に答える