@Override public int getMemory(Object obj, int columnIndex) { TransactionalValue v = (TransactionalValue) obj; return valueType.getMemory(v.value, columnIndex); } }
default int getMemory(Object obj, int columnIndex) { return getMemory(obj); }
@Override public int getMemory(Object obj) { StorageDataType t = getType(obj); if (t == this) { return averageSize; } return t.getMemory(obj); }
protected int recalculateKeysMemory() { int mem = PageUtils.PAGE_MEMORY; StorageDataType keyType = map.getKeyType(); for (int i = 0, len = keys.length; i < len; i++) { mem += keyType.getMemory(keys[i]); } return mem; }
@Override public int getMemory(Object obj) { TransactionalValue v = (TransactionalValue) obj; // tid最大8字节 return (v.isCommitted() ? 1 : 8) + valueType.getMemory(v.value); // TODO 由于BufferedMap的合并与复制逻辑的验证是并行的, // 可能导致split时三个复制节点中某些相同的TransactionalValue有些globalReplicationName为null,有些不为null // 这样就会得到不同的内存大小,从而使得splitKey不同 // return valueType.getMemory(v.value) + 12 // + (v.globalReplicationName == null ? 1 : 9 + ValueString.type.getMemory(v.globalReplicationName)); }
@Override public int getMemory(Object obj, int columnIndex) { VersionedValue v = (VersionedValue) obj; Value[] columns = v.value.getList(); if (columnIndex >= 0 && columnIndex < columns.length) { return valueType.getMemory(columns[columnIndex]); } else { return 0; } } }
@Override public int getMemory() { int memory = 0; // 延迟计算 if (values != null) { StorageDataType valueType = map.getValueType(); for (int row = 0, rowCount = values.length; row < rowCount; row++) { memory += valueType.getMemory(values[row], columnIndex); } } return memory; }
@Override public int getMemory(Object obj) { VersionedValue v = (VersionedValue) obj; int memory = 4; if (v == null) return memory; Value[] columns = v.value.getList(); for (int i = 0, len = columns.length; i < len; i++) { Value c = columns[i]; if (c == null) memory += 4; else memory += valueType.getMemory(c); } return memory; }
@Override public Object setValue(int index, Object value) { Object old = values[index]; // this is slightly slower: // values = Arrays.copyOf(values, values.length); values = values.clone(); StorageDataType valueType = map.getValueType(); addMemory(valueType.getMemory(value) - valueType.getMemory(old)); values[index] = value; return old; }
/** * Replace the key at an index in this page. * * @param index the index * @param key the new key */ @Override public void setKey(int index, Object key) { // this is slightly slower: // keys = Arrays.copyOf(keys, keys.length); keys = keys.clone(); Object old = keys[index]; StorageDataType keyType = map.getKeyType(); int mem = keyType.getMemory(key); if (old != null) { mem -= keyType.getMemory(old); } addMemory(mem); keys[index] = key; }
@Override public void insertLeaf(int index, Object key, Object value) { int len = keys.length + 1; Object[] newKeys = new Object[len]; DataUtils.copyWithGap(keys, newKeys, len - 1, index); keys = newKeys; Object[] newValues = new Object[len]; DataUtils.copyWithGap(values, newValues, len - 1, index); values = newValues; keys[index] = key; values[index] = value; totalCount++; addMemory(map.getKeyType().getMemory(key) + map.getValueType().getMemory(value)); }
@Override protected void recalculateMemory() { int mem = recalculateKeysMemory(); StorageDataType valueType = map.getValueType(); for (int i = 0, len = keys.length; i < len; i++) { mem += valueType.getMemory(values[i]); } addMemory(mem - memory); }
@Override public void remove(int index) { int keyLength = keys.length; int keyIndex = index >= keyLength ? index - 1 : index; Object old = keys[keyIndex]; addMemory(-map.getKeyType().getMemory(old)); Object[] newKeys = new Object[keyLength - 1]; DataUtils.copyExcept(keys, newKeys, keyLength, keyIndex); keys = newKeys; }
@Override public void remove(int index) { int keyLength = keys.length; super.remove(index); Object old = values[index]; addMemory(-map.getValueType().getMemory(old)); Object[] newValues = new Object[keyLength - 1]; DataUtils.copyExcept(values, newValues, keyLength, index); values = newValues; totalCount--; }
@Override public void insertNode(int index, Object key, BTreePage childPage) { Object[] newKeys = new Object[keys.length + 1]; DataUtils.copyWithGap(keys, newKeys, keys.length, index); newKeys[index] = key; keys = newKeys; int childCount = children.length; PageReference[] newChildren = new PageReference[childCount + 1]; DataUtils.copyWithGap(children, newChildren, childCount, index); newChildren[index] = new PageReference(childPage, childPage.getPos(), childPage.getTotalCount(), key, index == 0); children = newChildren; totalCount += childPage.getTotalCount(); addMemory(map.getKeyType().getMemory(key) + PageUtils.PAGE_MEMORY_CHILD); }