【发布时间】:2019-07-01 08:15:19
【问题描述】:
我需要解析 200MB 大小的 json 文件,最后我想从 sqlite3 数据库中的文件中写入数据。我有一个可用的 Python 代码,但完成任务大约需要 9 分钟。
@transaction.atomic
def create_database():
with open('file.json') as f:
data = json.load(f)
cve_items = data['CVE_Items']
for i in range(len(cve_items)):
database_object = Data()
for vendor_data in cve_items[i]['cve']['affects']['vendor']['vendor_data']:
database_object.vendor_name = vendor_data['vendor_name']
for description_data in cve_items[i]['cve']['description']['description_data']:
database_object.description = description_data['value']
for product_data in vendor_data['product']['product_data']:
database_object.product_name = product_data['product_name']
database_object.save()
for version_data in product_data['version']['version_data']:
if version_data['version_value'] != '-':
database_object.versions_set.create(version=version_data['version_value'])
是否可以加快进程?
【问题讨论】:
-
总是很难确定一个 ORM 会掩盖实际发生的事情的细节,但我敢打赌,它是在做一堆插入而不将它们全部包装在一个事务中,这意味着每个都是它自己的事务.以这种方式进行大量插入很慢,是的。
-
@Shawn 我也尝试过使用 transaction.atomic,但它并没有改变性能。我更改了问题中的代码。