Django+PostgreSQL 1000次插入/秒,如何加速?

2024-09-30 03:25:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我做了一些诊断发现htop

  • python save_to_db.py占用86%的CPU
  • postgres: mydb mydb localhost idle in transaction占用16%的CPU。在

我的save_to_db.py代码如下:

import datetime
import django
import os
import sys
import json
import itertools
import cProfile

# setting up standalone django environment
...

from django.db import transaction
from xxx.models import File

INPUT_FILE = "xxx"
with open("xxx", "r") as f:
    volume_name = f.read().strip()

def todate(seconds):
    return datetime.datetime.fromtimestamp(seconds)

@transaction.atomic
def batch_save_files(files, volume_name):
    for jf in files:
        metadata = files[jf]
        f = File(xxx=jf, yyy=todate(metadata[0]), zzz=todate(metadata[1]), vvv=metadata[2], www=volume_name)
        f.save()

with open(INPUT_FILE, "r") as f:
    dirdump = json.load(f)

timestamp = dirdump["curtime"]
files = {k : dirdump["files"][k] for k in list(dirdump["files"].keys())[:1000000]}

cProfile.run('batch_save_files(files, volume_name)')

以及相应的cProfile转储(我只保留了cumtime大的):

^{pr2}$

运行time python save_to_db.py需要14分钟,大约1000次插入/秒。这相当慢。在

我的File模式如下:

xxx  TEXT UNIQUE NOT NULL PRIMARY KEY
yyy  DATETIME
zzz  DATETIME
vvv  INTEGER
www  TEXT

我似乎不知道如何加快这个过程。有没有我不知道的方法?目前我索引所有的东西,但如果这是主要的瓶颈,我会非常惊讶。在

谢谢你!在


Tags: todjangonameinpyimportdbdatetime
1条回答
网友
1楼 · 发布于 2024-09-30 03:25:11

您可以使用bulk create。在

objs = [
    File(
        xxx=jf,
        yyy=todate(metadata[0]),
        zzz=todate(metadata[1]),
        vvv=metadata[2],
        www=volume_name
    )
    for jf in files
]
filelist = File.objects.bulk_create(objs)

相关问题 更多 >

    热门问题