0

我的印象是 aByteArrayOutputStream的内存效率不高,因为它的所有内容都存储在内存中。

同样,调用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字节 []?或者也许是不同类型的流?或者我应该为每个流发送 1 条记录,而不是加载具有多条记录的流?

4

1 回答 1

0

ByteArrayOutputStream在处理小型对象(如中小型图像)或固定大小的请求/响应时很有意义。它在内存中并且不接触磁盘,因此这对性能非常有用。将它用于 1 TerraByte 的数据没有任何意义。可能这是一个试图在书中保持一个小例子和独立的例子,以免偏离重点。


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

解码的方法似乎是将每条消息的字节读取到一个字节数组中,然后将其交给您的 BinaryDecoder(在找到消息边界之后)。

于 2013-02-25T08:48:11.773 回答