【问题标题】:psycopg2 COPY using cursor.copy_from() freezes with large inputspsycopg2 COPY 使用 cursor.copy_from() 冻结大输入
【发布时间】:2011-03-30 08:15:14
【问题描述】:

考虑以下 Python 代码,使用 psycopg2 cursor 对象(为清楚起见,更改或省略了一些列名):

filename='data.csv'
file_columns=('id', 'node_id', 'segment_id', 'elevated', 
              'approximation', 'the_geom', 'azimuth')
self._cur.copy_from(file=open(filename),
                    table=self.new_table_name, columns=file_columns)
  • 数据库位于快速 LAN 上的远程计算机上。
  • 使用 bash 中的 \COPY 运行速度非常快,即使对于大型(约 1,000,000 行)文件也是如此。

这段代码对于 5000 行来说是超快的,但是当 data.csv 超过 10000 行时,程序会完全冻结。

有什么想法\解决方案吗?

亚当

【问题讨论】:

    标签: python postgresql large-data-volumes psycopg2


    【解决方案1】:

    这只是一种解决方法,但您可以将某些内容通过管道传输到 psql 中。有时我懒得打掉 psycopg2 时会使用这个食谱

    import subprocess
    def psql_copy_from(filename, tablename, columns = None):
        """Warning, this does not properly quote things"""
        coltxt = ' (%s)' % ', '.join(columns) if columns else ''
        with open(filename) as f:
            subprocess.check_call([
                'psql',
                '-c', 'COPY %s%s FROM STDIN' % (tablename, coltxt),
                '--set=ON_ERROR_STOP=true', # to be safe
                # add your connection args here
            ], stdin=f)
    

    就您的锁定而言,您是否使用多个线程或类似的东西?

    您的 postgres 是否记录了诸如关闭连接或死锁之类的内容?锁定后你能看到磁盘活动吗?

    【讨论】:

    • +1 谢谢,这是我使用的解决方案,语法略有不同。我没有看到任何死锁迹象,并且磁盘活动正常(这是一个相当繁忙的服务器)。
    【解决方案2】:

    这是内存限制,导致“copy_from”在 open(filename) 一次性返回所有文件时崩溃。这是 psycopg2 的问题,而不是 Postgresql 的问题,所以 Mike 的解决方案是最好的。

    如果您想在常规提交中使用“copy_from”并同时管理重复键,有一个解决方案: https://stackoverflow.com/a/11059350/1431079

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多