2016-07-31 12 views
-3

私はHTTPライブラリを使用して、200 MBのサイズのデータ​​を取得しています。次に、データの各行が処理されます。メモリを節約するために、最初に200 MBがすべてダウンロードされるのを待つのではなく、データがストリーミングされるたびに1行ずつデータを処理したいと考えています。Javaの無制限PipedInputStream

は、私が使用していますHTTPライブラリは、私はエフェクト処理中のデータの各チャンクは、それがに来ることができますようように上書きすることができますOnCharReceived(CharBufferのバッファ)のようになります方法を公開しています。

私がしたいと思います このデータをInputStreamとして公開します。私の最初の考えは、PipedInputStreamとPipedOutputStreamのペアを使用し、OnCharReceived()でPipedOutputStreamとPipedInputStreamから読み込んだスレッドに書き込むことでした。しかし、これは、スレッドのデータが処理されるまでOnCharReceivedで書き込みスレッドをブロックする必要があるため、パイプの基になるバッファがいっぱいになるという問題があります。しかし、OnCharReceivedをブロックすると、httpライブラリのIOスレッドでブロックされている可能性があり、非常に悪いです。

独自のカスタム実装をロールバックせずにここで解決する必要がある抽象的な問題を処理するJavaクラスがあります。私は大きなソリューションの一部として使用できるBlockingQueueのようなものを知っています。しかし、単純な解決策はありますか?

レガシーコードの理由から、私は実際にはInputStreamとして公開されているデータが必要です。

編集:私はPiped[In/Out]putStreamの近くに取得しません簡単な解決策があるのなら、私は、Apache HTTP非同期ライブラリーから、次の例に

https://hc.apache.org/httpcomponents-asyncclient-dev/httpasyncclient/examples/org/apache/http/examples/nio/client/AsyncClientHttpExchangeStreaming.java

+2

あなたは丘陵地帯から山を作っています。本当に本当にそのライブラリを使用する必要があるのであれば、 'URL.openStream()'やそれに相当するライブラリを使用してください。コールバックを使用し、別のスレッドが使用するために* back *をストリームに変換しようとするのは時間と空間を無駄にするだけです。 – EJP

+0

@EJP小さなライブラリーは解読の問題に対処すれば正当化できます。例えば、このライブラリーが提供するAPIと統合する必要がある場合は – Dici

+0

正確に編集してください。そのライブラリはすでに 'InputStream'を公開しています。これを使って。 – EJP

答えて

1

を自分のコードを基づかています具体的に。あなたが指摘しているように、不必要な複雑なスレッドの問題を導入します。常にテンポラリファイルに書き込んでから、InputStreamとしてファイルから読み取ることができます。これには、できるだけ早くHTTP接続を閉じ、タイムアウトを回避するという利点もあります。

使用しているAPIによっては他にも解決策があるかもしれませんが、上記の理由から提案された解決策はまだ理にかなっていると思います。

関連する問題