我花了很多时间研究这个,并没有真正找到任何解释这一点,所以我希望有人在这里可以提供帮助。我目前正在编写一个程序来清理和输入大量数据(可能是几十GB)到Postgres表中。
我当前的设置让我读入并将原始CSV数据清理成新的CSV文件,然后运行COPY FROM命令将新的CSV文件读入表格。
这有一些明显的问题,包括基本上读取文件2-3次,以及需要的双倍存储空间。读入新文件然后将该文件读入Postgres似乎效率低下,而不是直接将其直接流式传输到Postgres shell的STDIN并将该插入直接插入表中。
如果有人有类似问题的处理经验,您是否发现将文件简单地流式传输到Postgres的STDIN更快/可能?我在Java中实现这一点,因此非常感谢我能解决这个问题的所有帮助!
谢谢!
答案 0 :(得分: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
。我想你可以写下剩下的部分代码。 :)