如何使用python高效地从大型postgres表中提取所有行?

如何使用python高效地从大型postgres表中提取所有行?,python,postgresql,fetch,psycopg2,data-extraction,Python,Postgresql,Fetch,Psycopg2,Data Extraction,我已经能够使用python从postgres表中提取近350万行并写入文件。然而,这个过程非常缓慢,我肯定不是最有效的。 以下是我的代码: 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

我已经能够使用python从postgres表中提取近350万行并写入文件。然而,这个过程非常缓慢,我肯定不是最有效的。 以下是我的代码:

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))

这张桌子大约有800万行。我想问的是,有没有更好、更快、内存占用更少的方法来实现这一点。

我可以看到四个字段,所以我假设您只选择了这些字段

但即便如此,您仍然在从另一台服务器加载8 mil x 4 x n字节的数据。所以是的,这需要一些时间

尽管您正在尝试重建控制盘,为什么不使用PostgreSQL客户机呢

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

我可以看到四个字段,所以我假设您只选择了这些字段

但即便如此,您仍然在从另一台服务器加载8 mil x 4 x n字节的数据。所以是的,这需要一些时间

尽管您正在尝试重建控制盘,为什么不使用PostgreSQL客户机呢

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

正如Loïc所建议的那样,Psycopg2的copy_to命令与psql转储的功能完全相同,只是它在python方面。我发现这是得到一张桌子的最快方法

某些数据类型(如hstore/json和composite类型)的格式有点古怪,但命令非常简单

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

这里的文档:

正如Loïc所建议的,Psycopg2的copy_to命令与psql转储的功能完全相同,只是它位于python端。我发现这是得到一张桌子的最快方法

某些数据类型(如hstore/json和composite类型)的格式有点古怪,但命令非常简单

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

这里的文档:

您分析过它吗?瓶颈在哪里?时间/内存/cpu/磁盘上的限制是什么?可能,只需通过Postgres对此任务进行转储。如果这些是您真正的db凭据,我建议您删除此问题,更改服务器上的凭据(以及代码中的任何位置),然后再次粘贴问题(不带db凭据)@Loïc不这些都是虚构的credentials@ChadS. 我还没有分析,但我会做的。我只想知道我的方法是否有明显的编程缺陷,你有没有分析过?瓶颈在哪里?时间/内存/cpu/磁盘上的限制是什么?可能,只需通过Postgres对此任务进行转储。如果这些是您真正的db凭据,我建议您删除此问题,更改服务器上的凭据(以及代码中的任何位置),然后再次粘贴问题(不带db凭据)@Loïc不这些都是虚构的credentials@ChadS. 我还没有分析,但我会做的。我只想知道我的方法是否有明显的编程缺陷