我有一个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米的行不会起作用。
还有什么我可以尝试的吗?
答案 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]。