0

我写了一个map reduce程序,我的值格式是:

Integer@BitSet

我想减少随机播放的大小。好用吗

Vector<Object> vec=new Vector();
vec.add(Integer);
vec.add(BitSet);

这个向量很大吗?哪种数据结构在我的情况下是最好的?

4

2 回答 2

0

两者都BitSetIntegers扩展Object

所以你的例子会起作用。

是同步的Vector,因此会导致性能下降。

我会使用ArrayList界面。

List<Object> bb = new ArrayList<Object>();
bb.add(new Integer(3));
bb.add(new BitSet(5));

我没有看到任何共同点,但只有对象。

使用单个类作为结构的其他方式,

public class Struct{
   private Integer mInt;
   private BitSet mBitSet;
}

...
Struct struct;
List<Struct> bb = new ArrayList<Struct>();
struct = new Struct(new Integer(3));
bb.add(struct);
struct = new Struct(new BitSet(5));
bb.add(struct);

....
于 2013-09-25T17:45:57.750 回答
0

如果你想减少 shuffle 的大小,一个很好的减少它的方法是实现一个自定义的 Writable 类。hadoop 处理奇怪类型的序列化有时会产生相当多的开销,因此自定义 Writable 可以让您完全控制,并且您还可以使用非常有效的“原始” Writable 类型。你可以这样做:

public class IntAndBitSetWritable implements Writable {

    private IntWritable n;
    private BytesWritable bytes;

    @Override
    public void readFields(DataInput in) throws IOException {
        n.readFields(in);
        bytes.readFields(in);
    }

    @Override
    public void write(DataOutput out) throws IOException {
        n.write(out);
        bytes.write(out);
    }

    public BitSet getBitSet() {
        return BitSet.valueOf(bytes.getBytes());
    }

    public int getInt() {
        return n.get();
    }

    public void setBitSet(BitSet b) {
        byte[] arr = b.toByteArray();
        bytes.setSize(arr.length);
        bytes.set(arr, 0, arr.length);
    }

    public void setInt(int i) {
        n.set(i);
    }

}

请注意,以上假设使用 Java 7 进行BitSetto/from的转换byte[]。如果使用 Java 6,您可能需要实现不同的转换方法。

于 2013-09-25T23:03:32.213 回答