我编写了一个地图缩减程序,我的值格式为:
Integer@BitSet
我想减少随机播放的大小。使用
是否合适Vector<Object> vec=new Vector();
vec.add(Integer);
vec.add(BitSet);
这个向量是否大?在我的情况下哪个数据结构最好?
答案 0 :(得分:0)
BitSet
和Integers
都来自Object
。
所以你的例子会有用。
Vector
已同步,因此会导致性能下降。
我会使用ArrayList
界面。
List<Object> bb = new ArrayList<Object>();
bb.add(new Integer(3));
bb.add(new BitSet(5));
我没有看到任何共同点,只有对象。
将单个类用作Structure的其他方法,
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);
....
答案 1 :(得分: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,将BitSet
转换为byte[]
。如果使用Java 6,则可能需要实现不同的转换方法。