从大型ByteArrayOutputSteam了解Avro反序列化

时间:2013-02-25 08:09:47

标签: java serialization bigdata avro bytearrayoutputstream

我认为ByteArrayOutputStream不具有内存效率,因为它的所有内容都存储在内存中。

同样,在大流上调用toByteArray似乎“缩放得很差”。

为什么在Tom White的书Hadoop: the Definitive Guide中的示例中的示例中使用它们:

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

“大数据”不是Avro的常态吗?我错过了什么?

编辑1:我正在尝试做什么 - 说我正在通过websocket传输avros。如果我想反序列化多个记录,而不仅仅是一个放在它自己的ByteArrayOutoputStream中的记录,那么该示例会是什么样子?

有没有更好的方法为BinaryDecoder提供byte []?或者也许是不同类型的流?或者我应该每个流发送1条记录而不是加载具有多条记录的流?

1 个答案:

答案 0 :(得分:0)

处理小型对象(如中小型图像或固定大小的请求/响应)时,

ByteArrayOutputStream 是有意义的。它在内存中并且不接触磁盘,因此这对于性能来说非常有用。将它用于1 TerraByte数据没有任何意义。可能这是一个试图在书中保持小而自成一体的例子,以免损害主要观点。


编辑:现在我知道你要去哪里设置管道了。从流中拉出一条消息(所以我假设您可以从HTTP对象获取InputStream)并使用无内存方法处理它或将其抛入队列并使用线程池处理带有内存的队列无方法。因此,对此的要求是:1)能够在将Avro消息从流中拉出并具有解码方法时检测Avro消息之间的边界。

解码的方法似乎是将每条消息的字节读入字节数组并将其传递给BinaryDecoder(在找到消息边界之后)。