2016-03-22 41 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。我认为你可以编写代码的其余部分。 :)