代码之家  ›  专栏  ›  技术社区  ›  Adam Matan

psycopg2拷贝使用cursor.copy_from()大量输入时冻结

  •  0
  • Adam Matan  · 技术社区  · 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)
    
    • 使用 \COPY from bash的工作速度非常快,即使对于大型(约1000000行)文件也是如此。

    这段代码对于5000行来说非常快,但是 data.csv

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

    亚当

    2 回复  |  直到 14 年前
        1
  •  5
  •   mikelikespie    14 年前

    这只是一个解决方法,但您可以通过管道将某些内容导入psql。有时候我懒得把精神病发作的时候就用这个食谱

    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是否记录了诸如关闭连接或死锁之类的内容?你能看到它锁定后的磁盘活动吗?

        2
  •  1
  •   Community paulsm4    7 年前

    这就是内存限制,使得“copy\u from”在打开时崩溃(文件名)一次返回所有文件。这是psycopg2的问题,不是Postgresql的问题,所以Mike的解决方案是最好的。

    如果要使用“copy\u from”进行常规提交并同时管理重复密钥,有一种解决方案: https://stackoverflow.com/a/11059350/1431079

    推荐文章