gpt4 book ai didi

java - 如何在hadoop中有位串?

转载 作者:可可西里 更新时间:2023-11-01 16:33:29 25 4
gpt4 key购买 nike

我正在用 Java 编写程序。我的 key 是可写的,值是一个位串 0,1。位串的大小可能是 1,000,000(由 0 或 1 组成)。我必须使用占用最少空间的哪种类型的数据?谢谢。

最佳答案

您可以使用 java.util.BitSet将您的位打包成多头,从而接受某种压缩。在提到的 1024 位的情况下,您可以使用占用 8 个字节的 1024/64=16 个 long 对数据进行编码,因此总共只使用 128 个字节。

要实现Writable,您必须实现相同的调用接口(interface):

public class BitSetWritable implements Writable {

private BitSet set;

public BitSetWritable() {
// default constructor
}

public BitSetWritable(BitSet set) {
this.set = set;
}
[...]
}

我在这里添加了一些方便的构造函数,请注意默认构造函数是 Hadoop 序列化机制的必备条件。

实现接口(interface)后,强制实现readFieldswrite两个方法:

 @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 个字节的开销),然后是 bitset 的 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

关于java - 如何在hadoop中有位串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18406592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com