2016-03-22 72 views
0

我花了很多時間研究這個問題,而且還沒有真正找到任何解釋這個的地方,所以我希望這裏有人能夠提供幫助。我目前正在編寫一個程序來清理並向Postgres表中輸入大量數據(可能爲數十GB)。PostgreSQL COPY FROM file vs STDIN

我目前的設置讓我讀入原始CSV數據並清理成新的CSV文件,然後再運行COPY FROM命令,將新的CSV文件讀入表格。

這存在一些明顯的問題,包括基本讀取文件2-3次,以及需要雙倍的存儲空間。讀入新文件然後將該文件讀入Postgres中似乎效率不高,而不是直接將其直接傳輸到Postgres shell的STDIN,並直接將該文件插入到表中。

如果任何人有類似問題的處理經驗,你覺得它更快/可能簡單地流文件到STDIN的Postgres?我在Java中實現了這個功能,因此我非常感謝能夠解決這個問題的任何和所有幫助。

謝謝!

+1

您可以使用JDBC驅動程序的'CopyManager'支持:https://jdbc.postgresql.org/documentation/publicapi/org/postgresql/copy/CopyManager.html –

+0

我一直在嘗試使用它,但一直未能弄清楚如何將數據「串流」到Postgres的STDIN,我最終所做的只是在清理結束時調用copyIn函數並將SQL語句以及fileReader打開了我清理過的文件。您是否有任何示例代碼或解釋說明如何將每個CSV行插入到STDIN中,因爲它們是從清潔中進來的? – schriste92

+0

'copyIn()'只需要'Reader'作爲參數。讓你的「清潔代碼」實現該接口,然後將其傳遞給CopyManager –

回答

0

一起使用PipedInputStream和PipedOutputStream,因此您可以直接從源CSV文件讀取,然後寫入將在copyIn()函數中使用的inputStream。 下面是一個例子:

PipedInputStream is = new PipedInputStream(); 
PipedOutputStream os = new PipedOutputStream(is); 
BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); 
BufferedReader fr = new BufferedReader(new FileReader("path/to/file")); 

比從fr讀寫bw。我認爲你可以編寫代碼的其餘部分。 :)