我需要从数据库中提取大量数据(> 1GB)到csv文件。我正在使用这个脚本:
localhost:32557/
当写入系统内存不足的文件时出现问题。在这种情况下,还有其他更有效的方法来创建一个大的csv文件吗?
答案 0 :(得分:2)
psycopg2
(OP使用)有fetchmany
方法接受size
参数。用它来从数据库中读取一定数量的行。您可以使用n
的值过期,以在运行时和内存使用之间取得平衡。
fetchmany
文档:http://initd.org/psycopg/docs/cursor.html#cursor.fetchmany
rs_cursor = rs_db.cursor()
rs_cursor.execute("""SELECT %(sql_fields)s
FROM table1""" % {"sql_fields": sql_fields})
c = csv.writer(open(filename, "wb"))
c.writerow(headers)
n = 100
sqlData = rs_cursor.fetchmany(n)
while sqlData:
for row in sqlData:
c.writerow(row)
sqlData = rs_cursor.fetchmany(n)
rs_cursor.close()
您也可以使用生成器将其包装起来以简化代码:
def get_n_rows_from_table(n):
rs_cursor = rs_db.cursor()
rs_cursor.execute("""SELECT %(sql_fields)s
FROM table1""" % {"sql_fields": sql_fields})
sqlData = rs_cursor.fetchmany(n)
while sqlData:
yield sqlData
sqlData = rs_cursor.fetchmany(n)
rs_cursor.close()
c = csv.writer(open(filename, "wb"))
c.writerow(headers)
for row in get_n_rows_from_table(100):
c.writerow(row)
答案 1 :(得分:0)
你试过fetchone()?
rs_cursor = rs_db.cursor()
rs_cursor.execute("""SELECT %(sql_fields)s
FROM table1""" % {"sql_fields": sql_fields})
c = csv.writer(open(filename, "wb"))
c.writerow(headers)
row = rs_cursor.fetchone()
while row:
c.writerow(row)
row = rs_cursor.fetchone()
rs_cursor.close()