如何提高针对大型数据集的Django bulk_create的性能?(PostgreSQL)

2024-06-16 18:42:42 发布

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

我有大约164列x50000行的大型csv文件,希望将这些文件导入PostgreSQl数据库(12.2)

我使用Django3.0.7和Python3.6.8创建了一个模型DataRow,每个列有一个字段。导入文件时,我首先通过检查缺少的值等来验证它。然后,我为每一行创建一个DataRow-对象,并尝试使用bulk_create将所有内容加载到数据库中。下面是我的代码的样式化简短版本:

import pandas as pd

data = pd.read_csv(myfile)

validate_my_data(data)

data_row_objects = []
for row in data:
    data_row_objects.append(DataRow(**row_to_dict(row)))

DataRow.objects.bulk_create(data_row_objects, batch_size=3000)

到目前为止,它是有效的。验证所有对象并将其附加到data_row_objects大约需要8秒,这是正常的。但是,bulk_create-语句大约需要3分钟,这是不可接受的

那么,我该如何改进这里的性能呢?我已经尝试过增加/减少batch_size,但3000似乎是迄今为止最稳定的大小

我还读过stackoverflow上的一些帖子,其中提到将csv文件直接导入数据库要快得多。然而,我宁愿使用纯django,因为我认为这正是django的目的之一:避免与数据库直接通信

或者我必须更改PostgreSQL的设置吗?由于django和PostgreSQL都在一个单独的docker容器中,所以速度可能会慢一些

老实说,我很难区分这里的性能瓶颈,因为我还是django和数据库的初学者。但我认为必须有一种快速而优雅的方法,因为我的数据集并没有那么大,导入这样的文件应该是一项非常常见的任务

期待您的回答, 汤姆


Tags: 文件csv对象django数据库datasizeobjects