使用hadoop序列化机制时的一点小问题

其实在现在接触到的数据处理中还没怎么碰到到需要自己实现序列化对象的情况。偶然看到一篇文章,说的是由于偷懒而造成序列化和反序列化时造成的不必要的时间和空间消耗。其实如果自己遇到这种问题,应该也会使用同样偷懒的方法。这里说明一下,以便提醒自己要这么做时,是否考虑到了性能方面的问题。
原文地址:[url]http://teddziuba.com/2008/04/dont-serialize-java-object-in.html[/url]

@Override
public void write(DataOutput out) throws IOException {
ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
ObjectOutputStream objectOut = new ObjectOutputStream(byteOutStream);

objectOut.writeObject(getContainedObject());
objectOut.close();

byte[] serializedObject= byteOutStream.toByteArray();

out.writeInt(serializedObject.length);
out.write(serializedModel);

}

作者在写一个Writable类时,因为这个类有太多的成员变量(because it had a ton of instance variables),所以索性将这个类先放到一个字节数组中,然后再将此数组和数组长度写出去。这么做固然减少了相当的代码量,但可能带来的是性能方面的损耗。
作者做了个测试,序列化一个字节数组用了953字节,而直接序列化变量则只用了296字节。而且正确的序列化方法使一个有1600条记录的sequencefile从1.4GB压缩到了825MB。
在时间消耗方面,序列化object用了7.2ms,反序列化用了1.7ms。而用stream I/O则序列化只用了76000ns,反序列化用了58000ns。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值