2010-08-16 8 views
0

Рассмотрим следующий код в Python, используя psycopg2 cursor объект (Некоторые имена столбцов были изменены или опущены для ясности):psycopg2 Копирование с использованием cursor.copy_from() замерзает с большими входами

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 от bash работает очень быстро, даже для больших (~ 1,000,000 строк) файлов.

Этот код является сверхбыстрой для 5000 строк, но когда data.csv растет за пределами 10 000 строк, программа полностью замораживается.

Любые мысли \ решения?

Адам

ответ

4

Это просто обходной путь, но вы можете только трубы что-то в 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 протоколированием чего-либо такого, как закрытое соединение или тупик? Вы можете видеть активность диска после его блокировки?

+0

+1 Спасибо, что это решение я использовал, с немного другой синтаксис , Я не вижу никаких признаков блокировок, и активность диска нормальная (это довольно загруженный сервер). –

0

Это ограничение памяти, из-за которого сбой «copy_from» как открытый (имя файла) возвращает весь файл за один снимок. Это проблема psycopg2, а не Postgresql, поэтому решение Майка является лучшим.

Существует решение, если вы хотите использовать «copy_from» с регулярными фиксаций и управлять дубликаты ключей в то же время: https://stackoverflow.com/a/11059350/1431079

 Смежные вопросы

  • Нет связанных вопросов^_^