定长格式(IntWritbale和LongWritable)和变长格式(VIntWritable 和 VLongWritable)

对于定长格式和变长格式:

对整数进行编码时,有两种选择,即定长格式(IntWritbale和LongWritable)和变长格式(VIntWritable 和 VLongWritable).需要编码的数值如果想当小(在127和-127之间,包括-127和127之间 ),变长格式就是只用一个字节进行编码;否则使用第一个字节便是数值的正负和后跟多少个字节。

如何选择?

定长格式编码很适合数值在整个值域中非常均匀的情况,例如使用精心设计的哈希函数。然而,大多数数值变量分布不均匀,一般而言变长格式更加节省空间。变长格式的另一有点就是可以在VIntWritable和LongWritable之间转化,因为他们的编码实际上是一致的。所以选择变长更加省空间,不必开始就是8字节的long表示。

测试:

对整数168 使用IntWritable和VIntritable进行比较

package day20190721;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.VIntWritable;

public class test01 {
	public static void main(String[] args) throws Exception {
		
		
		ByteArrayOutputStream out=new ByteArrayOutputStream();
		DataOutputStream dataOutputStream=new DataOutputStream(out);
		IntWritable i=new IntWritable(168);
		i.write(dataOutputStream);
		dataOutputStream.close();
		System.out.println("定长:"+out.toByteArray().length);
		
		
		System.out.println(".......................");
	
		//IntWritable
		VIntWritable vi=new VIntWritable(168);
		ByteArrayOutputStream bos=new ByteArrayOutputStream();
		DataOutputStream dos=new DataOutputStream(bos);
		vi.write(dos);
		
		System.out.println("变长:"+bos.toByteArray().length);
		dos.close();
	}
}

输出结果比较:

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值