如何有效地使用 python 从大型 postgres table 中提取所有行?
How to extract all rows from a large postgres table using python efficiently?
我已经能够使用 python 从 postgres table 中提取近 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))
table 有大约 800 万行。我想问一下有没有更好更快内存占用更少的方法来完成这个。
我可以看到四个字段,所以我假设您只选择了这些。
但即便如此,您仍然从另一台服务器加载 800 万 x 4 x n 字节的数据。所以是的,这需要一些时间。
虽然你正在努力造轮子,但为什么不使用 PostgreSQL 客户端呢?
psql -d dbname -t -A -F"," -c "select * from users" > output.csv
Psycopg2 的 copy_to 命令与 psql 转储完全相同,正如 Loïc 所建议的,只是它在 python 方面。我发现这是获得 table 转储的最快方法。
某些数据类型(例如 hstore/json 和复合类型)的格式有点古怪,但命令非常简单。
f = open('foobar.dat', 'wb')
cursor.copy_to(f, 'table', sep='|', columns=['skills', 'id', 'history', 'industry'])
文档在这里:http://initd.org/psycopg/docs/cursor.html#cursor.copy_to
我已经能够使用 python 从 postgres table 中提取近 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))
table 有大约 800 万行。我想问一下有没有更好更快内存占用更少的方法来完成这个。
我可以看到四个字段,所以我假设您只选择了这些。
但即便如此,您仍然从另一台服务器加载 800 万 x 4 x n 字节的数据。所以是的,这需要一些时间。
虽然你正在努力造轮子,但为什么不使用 PostgreSQL 客户端呢?
psql -d dbname -t -A -F"," -c "select * from users" > output.csv
Psycopg2 的 copy_to 命令与 psql 转储完全相同,正如 Loïc 所建议的,只是它在 python 方面。我发现这是获得 table 转储的最快方法。
某些数据类型(例如 hstore/json 和复合类型)的格式有点古怪,但命令非常简单。
f = open('foobar.dat', 'wb')
cursor.copy_to(f, 'table', sep='|', columns=['skills', 'id', 'history', 'industry'])
文档在这里:http://initd.org/psycopg/docs/cursor.html#cursor.copy_to