2016-03-22 11 views
0

私はこれを研究するのに多くの時間を費やしましたが、実際にこれを説明するための何も発見していないので、ここの誰かが助けてくれることを願っています。私は現在、Postgresテーブルに大量のデータ(数十GBの可能性あり)をきれいにして入力するプログラムを書いています。PostgreSQL COPY FROMファイルからSTDIN

私の現在の設定では、元のCSVデータを新しいCSVファイルにコピーしてから、COPY FROMコマンドを実行してその新しいCSVファイルをテーブルに読み込みます。

基本的にファイルを2〜3回読み取るだけでなく、必要な倍精度の記憶域を含む、明らかな問題があります。 PostgresシェルのSTDINに直接ストリーミングするのではなく、そのファイルをテーブルに直接挿入するのではなく、新しいファイルを読み込んでそのファイルをPostgresに読み込むのは非効率的です。

誰かが同様の問題を扱っている経験がある方は、速く/簡単にファイルをPostgresのSTDINにストリームすることができましたか?私はこれを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に書き込むたより: はここでの例です。私はあなたがコードの残りの部分を書くことができると思います。 :)

関連する問題