【问题标题】:How to speed up parsing json and writing in the database?如何加快解析json和写入数据库的速度?
【发布时间】: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,但它并没有改变性能。我更改了问题中的代码。

标签: python json django sqlite


【解决方案1】:

假设所有对象都是独立的并且可以并行处理,一个简单的方法是使用multiprocessing 模块。

【讨论】:

  • 我喜欢这个主意。如何读取大型 json 文件并插入到 sqlite db 的任何体面示例。 (我正在处理具有 2.6M 记录的 2.5GB json)尝试了 ijson。目前使用一个简单的 'with open(filename) as lines: for line in lines: (读取行并使用 pandas.to_sql 插入,这将需要 6 天......
【解决方案2】:

假设问题在于文件很大,您可以使用像this one 这样的流式 json 解析器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多