0

ByteArrayOutputStreamaの内容はすべてメモリに保存されるため、 a はメモリ効率が悪い という印象を受けます。

同様に、大きなストリームを呼び出すtoByteArrayと、「スケーリングが不十分」のように見えます。

では、Tom White の著書Hadoop の例: Definitive Guideの例では、両方を使用しています。

    ByteArrayOutputStream out = new ByteArrayOutputStream;
    Decoder decoder = DecoderFactory().defaultFactory().createBinaryDecoder(out.toByteArray(), null);

「ビッグデータ」は Avro の標準ではありませんか? 私は何が欠けていますか?

編集 1: 私がやろうとしていること- ウェブソケット経由で avros をストリーミングしているとします。独自の 1 つのレコードだけでなく、複数のレコードを逆シリアル化したい場合、例はどのようになりByteArrayOutoputStreamますか?

BinaryDecoderbyte[]を提供するより良い方法はありますか? それとも、別の種類のストリームでしょうか? または、ストリームに複数のレコードをロードする代わりに、ストリームごとに 1 つのレコードを送信する必要がありますか?

4

1 に答える 1

0

ByteArrayOutputStreamは、小規模から中規模の画像や固定サイズのリクエスト/レスポンスなどの小さなオブジェクトを処理する場合に意味があります。メモリ内にあり、ディスクに触れないため、パフォーマンスが向上します。1 テラバイトのデータに使用しても意味がありません。おそらくこれは、本の中の例を小さく自己完結型に保ち、要点を損なわないようにしているケースです。


編集: パイプラインをセットアップしようとしているところがわかったので。ストリームからメッセージを取得し (HTTP オブジェクトから InputStream を取得できると想定しています)、メモリのないメソッドで処理するか、キューにスローしてスレッドプールにメモリを使用してキューを処理させます。 -少ない方法。したがって、このための要件は、1) Avro メッセージをストリームから引き出すときに、Avro メッセージ間の境界を検出できることと、デコードする方法があることです。

デコードする方法は、各メッセージのバイトをバイト配列に読み取り、それを BinaryDecoder に渡すように見えます (メッセージ境界を見つけた後)。

于 2013-02-25T08:48:11.773 に答える