【问题标题】:How to speed up copy_expert in postgresql?如何加快 postgresql 中的 copy_expert?
【发布时间】:2019-02-15 12:57:08
【问题描述】:

以下函数在 111 秒内导入大约 6 万条记录。我听其他人说 copy_from 和 copy_expert 在不到一分钟的时间内完成了 100 万条记录。与使用 copy_from 相比,使用 copy_expert 是否会减慢进程?我可以做些什么来优化它?

cursor = connection.cursor()
cursor.copy_expert('''
COPY employee_employee (name, slug, title, base, overtime, other, gross, benefits, ual, total, year, status, jurisdiction_id, notes)
FROM STDIN WITH (FORMAT csv, HEADER true, FORCE_NOT_NULL (status));
''', open(csv_fname),
)

至于相关变量,数据库连接来自 Django (from django.db import connection)。该数据库在我本地的 Macbook Pro 上,并且是 PostgreSQL 10。

【问题讨论】:

    标签: python django postgresql sql-update django-queryset


    【解决方案1】:

    在您打开的文件中指定 buffering=2**10。

    我认为这是 OSX 上 psycopg2 的问题。我有同样的问题,它在 ubuntu 上运行得非常快。无论数据库是在 OSX 还是 Ubuntu 上,OSX 上的速度都很慢。我的 copy_expert 在 OSX 上花了 13 分钟。当我更改 buffering=2**10 时,它从 13 分钟变为 7 秒。

    【讨论】:

    • 请您解释一下。它是内置函数open(file, mode='r', buffering=- 1, encoding=None, errors=None, newline=None, closefd=True, opener=None) 吗?缓冲?我对 pipelinewise 应用程序有这个问题。它使用慢的 copy_expert 命令。
    • @SlavaLenskyy 打开文件时不要设置“buffering=-1”,而是将缓冲设置得更大。
    【解决方案2】:

    我建议使用出色的 django-postgres-copy,我曾经用它在几秒钟内轻松地将大约 100 万行的 som CSV 直接导入 PostgreSQL。

    它由加利福尼亚公民数据联盟制作,用于导入和导出分隔数据,Django 支持 PostgreSQL 的 COPY 命令。

    “这个包试图让使用 COPY 像 Django 支持的任何其他数据库例程一样简单。它由自定义模型管理器实现。”

    这是将 CSV 导入数据库表的方式。

    from myapp.models import MyModel
    
    MyModel.objects.from_csv("./data.csv", dict(name='NAME', number='NUMBER'))
    

    这是将数据库表导出为 CSV 的方式。

    from myapp.models import MyModel
    
    MyModel.objects.to_csv("./data.csv")
    

    阅读 django-postgres-copy documentation 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 2012-08-25
      • 2021-11-29
      • 2013-01-12
      • 1970-01-01
      • 2010-11-01
      相关资源
      最近更新 更多