2016-01-04 2 views
0

Мне удалось извлечь строки размером до 3,5 млн. Из таблицы postgres, используя python и записать в файл. Однако процесс очень медленный, и я уверен, что он не самый эффективный. Ниже мой код:Как извлечь все строки из большой таблицы postgres, используя python эффективно?

import psycopg2, time,csv 
conn_string = "host='compute-1.amazonaws.com' dbname='re' user='data' password='reck' port=5433" 
conn = psycopg2.connect(conn_string) 
cursor = conn.cursor() 
quert = '''select data from table;''' 
cursor.execute(quert) 

def get_data(): 
    while True: 
     recs = cursor.fetchmany(10000) 

     if not recs: 
      break 

     for columns in recs: 
      # do transformation of data here 
      yield(columns) 

solr_input=get_data() 

with open('prc_ind.csv','a') as fh: 
    for i in solr_input: 
     count += 1 

     if count % 1000 == 0: 
      print(count) 

     a,b,c,d = i['Skills'],i['Id'],i['History'],i['Industry'] 
     fh.write("{0}|{1}|{2}|{3}\n".format(a,b,c,d)) 

Таблица имеет около 8 мил строк. Я хочу спросить, есть ли лучший, более быстрый и менее интенсивный в памяти способ сделать это.

+1

Вы профилированные это? Где узкое место и каковы ограничения на время/память/процессор/диск? –

+1

Возможно, просто сделайте дамп через Postgres для этой задачи – Sergius

+0

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

ответ

3

Я вижу четыре поля, поэтому я предполагаю, что вы выбираете только эти.

Но даже тогда вы по-прежнему загружаете 8 mil x 4 x n Байты данных из того, что кажется другим сервером. Так что да, это займет некоторое время.

Хотя вы пытаетесь перестроить колесо, почему бы не использовать PostgreSQL-клиент?

psql -d dbname -t -A -F"," -c "select * from users" > output.csv 
1

команда copy_to psycopg2 в делает точно такую ​​же вещь, как Psql свалку, как это было предложено Лоик, за исключением того, что это в питона сторону вещей. Я нашел, что это самый быстрый способ получить таблицу дампа.

Форматирование некоторых типов данных (например, hstore/json и составных типов) немного забавно, но команда очень проста.

f = open('foobar.dat', 'wb') 
cursor.copy_to(f, 'table', sep='|', columns=['skills', 'id', 'history', 'industry']) 

Docs здесь: http://initd.org/psycopg/docs/cursor.html#cursor.copy_to

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