我正在用java写一个程序。我的密钥是可写的,值是位字符串0,1。位字符串的大小可以是1000000(由0或1组成)。我必须使用哪种类型的数据占用最少的空间?谢谢。
6ie5vjzr1#
你可以使用 java.util.BitSet 把你的比特压缩成长的,从而得到某种压缩。在上面提到的1024位的情况下,您可以使用1024/64=16 long对数据进行编码,这些long占用8个字节,因此总共只使用128个字节。实施 Writable 必须实现相同的被调用接口:
java.util.BitSet
Writable
public class BitSetWritable implements Writable { private BitSet set; public BitSetWritable() { // default constructor } public BitSetWritable(BitSet set) { this.set = set; } [...] }
我在这里添加了一些方便的构造器,注意默认构造器是hadoop序列化机制的必备工具。实现接口后,您将被迫实现两种方法: readFields 以及 write :
readFields
write
@Override public void write(DataOutput out) throws IOException { long[] longs = set.toLongArray(); out.writeInt(longs.length); for (int i = 0; i < longs.length; i++) { out.writeLong(longs[i]); } } @Override public void readFields(DataInput in) throws IOException { long[] longs = new long[in.readInt()]; for (int i = 0; i < longs.length; i++) { longs[i] = in.readLong(); } set = BitSet.valueOf(longs); }
这是非常直接的,你写在集合中分配的long数(只有4字节的开销),然后写位集合的long值。当你回读的时候,你也会做同样的事情。如果您想直接复制,我已将完整文件和测试用例添加到github上的库中:https://github.com/thomasjungblut/thomasjungblut-common/blob/master/src/de/jungblut/writable/bitsetwritable.javahttps://github.com/thomasjungblut/thomasjungblut-common/blob/master/test/de/jungblut/writable/bitsetwritabletest.java
1条答案
按热度按时间6ie5vjzr1#
你可以使用
java.util.BitSet
把你的比特压缩成长的,从而得到某种压缩。在上面提到的1024位的情况下,您可以使用1024/64=16 long对数据进行编码,这些long占用8个字节,因此总共只使用128个字节。实施
Writable
必须实现相同的被调用接口:我在这里添加了一些方便的构造器,注意默认构造器是hadoop序列化机制的必备工具。
实现接口后,您将被迫实现两种方法:
readFields
以及write
:这是非常直接的,你写在集合中分配的long数(只有4字节的开销),然后写位集合的long值。当你回读的时候,你也会做同样的事情。
如果您想直接复制,我已将完整文件和测试用例添加到github上的库中:
https://github.com/thomasjungblut/thomasjungblut-common/blob/master/src/de/jungblut/writable/bitsetwritable.java
https://github.com/thomasjungblut/thomasjungblut-common/blob/master/test/de/jungblut/writable/bitsetwritabletest.java