@Override public synchronized void relocate(int oldPosition, int newPosition, ByteBuffer oldBuffer, ByteBuffer newBuffer) { UpdateDoublesSketch sketch = sketches.get(oldBuffer).get(oldPosition); final WritableMemory oldRegion = getMemory(oldBuffer).writableRegion(oldPosition, maxIntermediateSize); if (sketch.isSameResource(oldRegion)) { // sketch was not relocated on heap final WritableMemory newRegion = getMemory(newBuffer).writableRegion(newPosition, maxIntermediateSize); sketch = UpdateDoublesSketch.wrap(newRegion); } putSketch(newBuffer, newPosition, sketch); final Int2ObjectMap<UpdateDoublesSketch> map = sketches.get(oldBuffer); map.remove(oldPosition); if (map.isEmpty()) { sketches.remove(oldBuffer); memCache.remove(oldBuffer); } }
@Test public void serializeDeserialize() { int sizeBytes = DoublesSketch.getUpdatableStorageBytes(128, 2000); WritableMemory mem = WritableMemory.wrap(new byte[sizeBytes]); UpdateDoublesSketch sketch1 = DoublesSketch.builder().build(mem); for (int i = 0; i < 1000; i++) { sketch1.update(i); } UpdateDoublesSketch sketch2 = UpdateDoublesSketch.wrap(mem); for (int i = 0; i < 1000; i++) { sketch2.update(i + 1000); } assertEquals(sketch2.getMinValue(), 0.0); assertEquals(sketch2.getMaxValue(), 1999.0); assertEquals(sketch2.getQuantile(0.5), 1000.0, 10.0); byte[] arr2 = sketch2.toByteArray(false); assertEquals(arr2.length, sketch2.getStorageBytes()); DoublesSketch sketch3 = DoublesSketch.wrap(WritableMemory.wrap(arr2)); assertEquals(sketch3.getMinValue(), 0.0); assertEquals(sketch3.getMaxValue(), 1999.0); assertEquals(sketch3.getQuantile(0.5), 1000.0, 10.0); }
@Test public void checkCopyToHeap() { final int k = 128; final int n = 400; // HeapUpdateDoublesSketch final HeapUpdateDoublesSketch huds = (HeapUpdateDoublesSketch) buildAndLoadQS(k, n); final HeapUpdateDoublesSketch target1 = DoublesUtil.copyToHeap(huds); DoublesSketchTest.testSketchEquality(huds, target1); // DirectUpdateDoublesSketch final WritableMemory mem1 = WritableMemory.wrap(huds.toByteArray()); final DirectUpdateDoublesSketch duds = (DirectUpdateDoublesSketch) UpdateDoublesSketch.wrap(mem1); final HeapUpdateDoublesSketch target2 = DoublesUtil.copyToHeap(duds); DoublesSketchTest.testSketchEquality(huds, duds); DoublesSketchTest.testSketchEquality(duds, target2); // HeapCompactDoublesSketch final CompactDoublesSketch hcds = huds.compact(); final HeapUpdateDoublesSketch target3 = DoublesUtil.copyToHeap(hcds); DoublesSketchTest.testSketchEquality(huds, hcds); DoublesSketchTest.testSketchEquality(hcds, target3); // DirectCompactDoublesSketch final Memory mem2 = Memory.wrap(hcds.toByteArray()); final DirectCompactDoublesSketch dcds = (DirectCompactDoublesSketch) DoublesSketch.wrap(mem2); final HeapUpdateDoublesSketch target4 = DoublesUtil.copyToHeap(dcds); DoublesSketchTest.testSketchEquality(huds, dcds); DoublesSketchTest.testSketchEquality(dcds, target4); }
@Override public synchronized void relocate(int oldPosition, int newPosition, ByteBuffer oldBuffer, ByteBuffer newBuffer) { UpdateDoublesSketch sketch = sketches.get(oldBuffer).get(oldPosition); final WritableMemory oldRegion = getMemory(oldBuffer).writableRegion(oldPosition, maxIntermediateSize); if (sketch.isSameResource(oldRegion)) { // sketch was not relocated on heap final WritableMemory newRegion = getMemory(newBuffer).writableRegion(newPosition, maxIntermediateSize); sketch = UpdateDoublesSketch.wrap(newRegion); } putSketch(newBuffer, newPosition, sketch); final Int2ObjectMap<UpdateDoublesSketch> map = sketches.get(oldBuffer); map.remove(oldPosition); if (map.isEmpty()) { sketches.remove(oldBuffer); memCache.remove(oldBuffer); } }