2015-05-17 54 views
4

我有一個2200萬行.csv文件(〜850mb),我正嘗試將其加載到Amazon RDS上的postgres數據庫中。它每次都會失敗(即使我將文件拆分爲更小的部分(100,000行中的每一行),甚至當我使用chunksize時也會出現錯誤(出現超時錯誤)。pandas .to_sql使用RDS超時

所有我目前做的是加載該.csv的數據幀,然後將其寫入使用df.to_sql(table_name, engine, index=False, if_exists='append', chunksize=1000)

我使用create_engine從SQLAlchemy的創建連接數據庫:engine = create_engine('postgresql:database_info')

我有測試用psycopg2寫入少量數據沒有問題,但寫入1000行大約需要50秒。顯然,22米行將無法正常工作。

還有什麼我可以嘗試嗎?

+1

如果你只是想將csv文件導入到數據庫中,最好使用postgresql'COPY'命令,所以你不需要往返py​​thon對象(這會讓它變慢)。 – joris

+0

此外,您使用的驅動程序是什麼? ('psycopg2'?)1000行的50s比我在postgres數據庫中遇到的要慢得多。所以也許這也是部分與數據庫的連接緩慢。 – joris

+0

感謝您的評論,我試過使用psycopg2。我會更新這個問題。 – emh

回答

1

熊貓DataFrame。 to_sql()方法不是專門爲大插入而設計的,因爲它不使用PostgreSQL COPY命令。 定期的SQL查詢可以超時,它不是熊貓的錯誤​​,它受數據庫服務器控制,但可以根據連接進行修改,請參閱this page並搜索'statement_timeout'。

我建議你做的事情是考慮使用Redshift,它針對數據倉庫進行了優化,並且可以使用Redshift Copy命令直接從S3存儲桶讀取大量數據轉儲。

如果您無法使用Redshift,我仍然建議您使用PostgreSQL COPY命令找到一種方法來執行此操作,因爲它是爲了規避您正在遇到的問題而發明的。

+0

好吧,爲了清楚起見,我應該將數據轉儲到S3存儲桶中,然後使用PostgreSQL COPY,對吧? – emh

+0

是的,如果PostgreSQL COPY命令允許你指定一個s3存儲桶讀取你在RDS中使用的PostgreSQL版本。 Redshift確實允許這樣做,並且由於它們密切相關,所以它應該可以工作。 – firelynx

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

其中輸出原本是大熊貓據幀與要寫入到數據庫列[1_str,2_str,3_float。

相關問題