1

100万の電子メールアドレスを含むCSVファイルがあるとします。ファイルを繰り返し処理して、各エントリを追加する必要があります。次に例を示します。

with open(file) as csv:
    for item in csv:
        Email.objects.create(email=item)

これは、このようなdjango ORMを通過して1Mオブジェクトを作成し、それらをデータベースに挿入するのに非常に時間がかかるようです。これよりも良い方法はありますか、それともこのタスクのためにdjangoから離れて、dbで直接実行する必要がありますか?

4

5 に答える 5

4

新しいbulk_createを使用することもできます

于 2012-05-19T05:11:55.173 に答える
1

これは、すべてのモデルオブジェクトの作成をバイパスするため、DB-APIにドロップして実行する必要があります。

于 2012-05-19T05:04:45.447 に答える
1

私見ですが、1回限りの挿入であれば、速度に大きな問題は見られません(1Mレコードは数時間もかかりません)。将来、django apiを使用してこれらのオブジェクトにアクセスする場合は、SQLレベルの挿入に頼るのを避け、livarが提案するようなdjangoのメソッドを使用して実行する必要があります(django 1.4を使用している場合)。

于 2012-05-19T05:16:43.160 に答える
1

さらにbulk_create、DBバックエンドがサポートしている限り、すべての挿入を1つのトランザクションに入れることができます。

from django.db.transaction import commit_on_success
#  with commit_on_success(), open(file) as csv: # in Python2.7
with commit_on_success():
    for item in csv:
        Email.objects.create(email=item)

また、bulk_create同じ値を持つアイテムは同じものとして扱われることに注意してください。

Email.objects.bulk_create([Email(email=item), Email(email=item)]) 

実際には2行ではなく1行を作成します

SQLのターンアラウンドが多いため、トランザクションソリューションはそれでも低速ですが、メモリ内にbulk_create100万個のインスタンスすべてを作成する必要はありませんEmail()(ジェネレーターはここでは機能しないようです)

さらに、 SQLレベルで直接行うことができます

于 2012-05-19T05:41:07.710 に答える
0

明らかに効率的な一括挿入/更新ライブラリであるDjangoDSEパッケージを調べることをお勧めします。

于 2012-05-19T09:37:41.640 に答える