0

xml ファイルを解析し、django db (pgsql) のデータを更新または作成するモジュールを作成しました。

データのインポート/更新が完了したら、オブジェクトのメタデータを更新しようとします。

ツリー構造には django-mptt を使用し、メタデータ アップデーターはオブジェクト間にそのような構造を作成するためのものです。

親に他の外部キーからのデータを入力するのに約1秒かかるのは本当に遅いです。

これを最適化するにはどうすればよいですか?

for index, place in enumerate(Place.objects.filter(type=Place.TOWN, town_id_equal=True)):
    place.parent = place.second_order_division
    place.save()

    print index
    if index % 5000 == 0:
        transaction.commit()
transaction.commit()

transaction.set_autocommit(False)
for index, place in enumerate(Place.objects.filter(type=Place.TOWN, town_id_equal=False,
                                                   parent__isnull=True)):

    place.parent = Place.objects.get(town_id=place.town_id_extra)
    place.save()

    print index
    if index % 5000 == 0:
        transaction.commit()
transaction.commit()


class Place(MPTTModel):
    first_order_division = models.ForeignKey("self", null=True, blank=True, verbose_name=u"Województwo",
                                             related_name="voivodeships")
    second_order_division = models.ForeignKey("self", null=True, blank=True, verbose_name=u"Powiat",
                                              related_name="counties")
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children')

編集:

最初の関数を次のように更新しました。

transaction.set_autocommit(False)
for index, obj in enumerate(Place.objects.filter(type=Place.COUNTY)):
    data = Place.objects.filter(second_order_division=obj, type=Place.TOWN, town_id_equal=True)
    data.update(parent=obj)
    print index
    transaction.commit()
4

2 に答える 2

1

ループを使用する代わりに、次のような一括更新を行う必要があります

最初のトランザクションでは、トランザクションを次の Django クエリに置き換えることができます。

Place.objects.filter(type=Place.TOWN, town_id_equal=True).update(parent=F('second_order_division'))

2 番目のトランザクションでは、Place モデルに対するクエリが再び実行されるため、一括更新を適用できません。このためには、ループのたびに「Place.objects.get(town_id=place.town_id_extra)」クエリを実行する手間を省く必要があります。

またはこのブログから助けを得ることができます

于 2014-01-17T11:35:50.633 に答える
-1

より一般的な質問に答えると、ほぼすべてのタイプのシステムのパフォーマンスを向上させる 1 つの戦術は次のとおりです。

システムの動的部分間の相互作用を最小限に抑える

それだけです:HTTPリクエスト、データベースクエリなどによるやり取りを最小限に抑えます。あなたの場合、データベースに対して複数のクエリを実行していますが、これは簡単に減らすことができます(おそらく1つまたは2つ)。

于 2014-01-17T13:55:01.633 に答える