@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); } }
@Override public boolean isSameResource(final Memory that) { return (gadget_ == null) ? false : gadget_.isSameResource(that); }
@Test public void directSketchShouldMoveOntoHeapEventually() { try (WritableDirectHandle wdh = WritableMemory.allocateDirect(1000)) { WritableMemory mem = wdh.get(); UpdateDoublesSketch sketch = DoublesSketch.builder().build(mem); Assert.assertTrue(sketch.isSameResource(mem)); for (int i = 0; i < 1000; i++) { sketch.update(i); } Assert.assertFalse(sketch.isSameResource(mem)); } }
@Override public boolean isSameResource(final Memory that) { return (gadget_ == null) ? false : gadget_.isSameResource(that); }
@Test public void checkIsSameResource() { int k = 16; WritableMemory mem = WritableMemory.wrap(new byte[(k*16) +24]); WritableMemory cmem = WritableMemory.wrap(new byte[8]); DirectUpdateDoublesSketch duds = (DirectUpdateDoublesSketch) DoublesSketch.builder().setK(k).build(mem); assertTrue(duds.isSameResource(mem)); DirectCompactDoublesSketch dcds = (DirectCompactDoublesSketch) duds.compact(cmem); assertTrue(dcds.isSameResource(cmem)); UpdateDoublesSketch uds = DoublesSketch.builder().setK(k).build(); assertFalse(uds.isSameResource(mem)); }
@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); } }