0

DBにできるだけ速く単純な行をロードするローダーをsqliteに書き込もうとしています。入力データは、postgresDBから取得した行のように見えます。sqliteに移動する行の概算量:20milから100mil。プロジェクトの制限により、sqlite以外のDBは使用できません。

私の質問は: そのようなローダーを書くための適切なロジックは何ですか?

最初に、カプセル化されたジェネレーターのセットを作成しようとしました。これは、Postgresから1行を取得し、それを少し修正してsqliteに入れます。行ごとに、個別のsqlite接続とカーソルを作成することになりました。そして、それはひどいように見えます。

2回目の試行で、sqlite接続とカーソルをジェネレーターからスクリプトの本体に移動しました。20milのすべてのレコードをフェッチして処理するまで、データをsqliteにコミットしないことが明らかになりました。そして、これはおそらく私のすべてのハードウェアをクラッシュさせる可能性があります。

3回目の試行では、Sqlite接続をループから遠ざけることを検討しましたが、処理して1行をSqliteにプッシュするたびにカーソルを作成/閉じます。これは良いですが、オーバーヘッドもあると思います。

また、トランザクションで遊ぶことも検討しました。行がSqliteにプッシュされるたびに、1つの接続、1つのカーソル、1つのトランザクション、およびジェネレーターで呼び出されるコミット。これは私が行く正しい方法ですか?

Pythonでそのようなコンポーネントを書くために広く使われているパターンはありますか?まるで自転車を発明しているような気がするからです。

4

3 に答える 3

1

SQLiteは巨大なトランザクションを簡単に処理できるので、最後にコミットしてみませんか?これを試したことはありますか?

1つのトランザクションに問題があると感じた場合は、トランザクションをコミットしてみませんnか?行を1つずつ処理し、必要に応じて挿入しますが、挿入をn実行するたびに、が追加されconnection.commit()て負荷が分散されます。

于 2012-12-17T18:00:22.700 に答える
0
  1. バルクとSQLiteについての私の以前の回答を参照してくださいおそらくここでも私の答えです
  2. 質問:SQLiteデータベースを管理していますか?キャッシュサイズなどに関連して微調整できるコンパイル時オプションがあります。目的に合わせて調整することもできます。

一般的に、#1の手順では、最大の見返りが得られます。

于 2012-12-17T21:08:44.903 に答える
0

ついに私は自分の問題を解決することができました。主な問題は、sqliteへの大量の挿入にありました。postgressからメモリへのすべてのデータのロードを開始した後、行の量を減らすために適切な方法でそれを集約し、処理時間を60時間から16時間に短縮することができました。

于 2012-12-20T16:31:49.913 に答える