我写了一个map reduce程序,我的值格式是:
Integer@BitSet
我想减少随机播放的大小。好用吗
Vector<Object> vec=new Vector();
vec.add(Integer);
vec.add(BitSet);
这个向量很大吗?哪种数据结构在我的情况下是最好的?
我写了一个map reduce程序,我的值格式是:
Integer@BitSet
我想减少随机播放的大小。好用吗
Vector<Object> vec=new Vector();
vec.add(Integer);
vec.add(BitSet);
这个向量很大吗?哪种数据结构在我的情况下是最好的?
两者都BitSet
从Integers
扩展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);
....
如果你想减少 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 进行BitSet
to/from的转换byte[]
。如果使用 Java 6,您可能需要实现不同的转换方法。