【发布时间】:2013-02-25 08:09:47
【问题描述】:
我的印象是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 提供一个字节[]?或者也许是不同类型的流?或者我应该为每个流发送 1 条记录,而不是加载具有多条记录的流?
【问题讨论】:
-
如果您具体说明您打算使用 Avro 做什么,您的问题会更容易回答。
-
长话短说,我正在扩展 Salat-Avro 以支持将 Scala 案例类序列化到 Avro 数据文件或从 Avro 数据文件序列化。我正在尝试实现数据文件和内存序列化方法之间的一致性。对于大型数据文件,我可以有效地反序列化 avros,因为 DataFileReader 是记录上的 iterator 并且不会将评估保存在内存中。与数据文件相比,内存中的反序列化不是通过迭代器在 Steam 上完成的,而是通过在其数据源上重复调用函数的求值来完成的。
-
更长的故事是“重复调用一个函数”对于少量记录是没有问题的,因为我可以通过
consing函数的结果生成一个Stream。但是随着记录数量的增加,Stream由于内存使用而变得不切实际。可悲的是,Iterator与cons没有类比,当我注意到问题中的规范示例可能不支持大量记录时,我正想知道该怎么做。
标签: java serialization bigdata avro bytearrayoutputstream