pandas .to_sql使用RDS超时

时间:2015-05-17 12:15:31

标签: python postgresql pandas amazon-rds

我有一个2200万行.csv文件(~850mb),我试图加载到Amazon RDS上的postgres数据库中。它每次都失败(我得到一个超时错误),即使我将文件拆分成较小的部分(每行100,000行),甚至当我使用chunksize时。

目前我正在做的是将.csv作为数据帧加载,然后使用df.to_sql(table_name, engine, index=False, if_exists='append', chunksize=1000)将其写入数据库

我正在使用sqlalchemy中的create_engine来创建连接:engine = create_engine('postgresql:database_info')

我已经测试过使用psycopg2编写少量数据而没有问题,但写入1000行需要大约50秒。显然,22米的行不会起作用。

还有什么我可以尝试的吗?

2 个答案:

答案 0 :(得分:1)

pandas DataFrame。to_sql()方法并不是专为大型插入而设计的,因为它不使用PostgreSQL COPY命令。 常规SQL查询可能会超时,这不是大熊猫的错,它由数据库服务器控制,但可以根据连接进行修改,请参阅this page并搜索“statement_timeout”。

我建议您做的是考虑使用Redshift,它针对数据仓库进行了优化,可以使用Redshift Copy命令直接从S3存储桶中读取大量数据转储。

如果您无法使用Redshift,我仍然建议您使用PostgreSQL COPY命令找到一种方法来执行此操作,因为它的发明是为了避开您遇到的问题。

答案 1 :(得分:1)

您可以将数据帧写入cString,然后使用Psycopg中的copy_from方法将其写入数据库,我相信它确实实现了@firelynx提到的PostgreSql COPY命令。

import cStringIO
dboutput = cStringIO.StringIO()
output = output.T.to_dict().values()   
dboutput.write('\n'.join([ ''.join([row['1_str'],'\t',
                                    row['2_str'], '\t',
                                    str(row['3_float'])
                                    ])   for row in output]))
dboutput.seek(0)
cursor.copy_from(dboutput, 'TABLE_NAME')
connenction.commit()

其中output最初是一个pandas数据帧,其中包含要写入数据库的列[1_str,2_str,3_float]。