/** * Uses random numbers to sample the entire map. * * @return an array of sampled elements */ private LfuPolicy.Metadata[] sampleElements(Map map) { int[] offsets = LfuPolicy.generateRandomSample(map.size()); DiskElement[] elements = new DiskElement[offsets.length]; Iterator iterator = map.values().iterator(); for (int i = 0; i < offsets.length; i++) { for (int j = 0; j < offsets[i]; j++) { iterator.next(); } elements[i] = (DiskElement) iterator.next(); } return elements; }
/** * Uses random numbers to sample the entire map. * * <p>This implemenation uses a key array. * * @return a random sample of elements */ protected Element[] sampleElementsViaKeyArray() { int[] indices = LfuPolicy.generateRandomSampleIndices(maximumSize); Element[] elements = new Element[indices.length]; for (int i = 0; i < indices.length; i++) { Object key = keyArray.get(indices[i]); if (key == null) { continue; } elements[i] = (Element) map.get(key); } return elements; }
/** * Uses random numbers to sample the entire map. * * <p>This implemenation uses the {@link ConcurrentHashMap} iterator. * * @return a random sample of elements */ protected Element[] sampleElements(int size) { int[] offsets = LfuPolicy.generateRandomSample(size); Element[] elements = new Element[offsets.length]; Iterator iterator = map.values().iterator(); for (int i = 0; i < offsets.length; i++) { for (int j = 0; j < offsets[i]; j++) { // fast forward try { iterator.next(); } catch (NoSuchElementException e) { // e.printStackTrace(); } } try { elements[i] = ((Element) iterator.next()); } catch (NoSuchElementException e) { // e.printStackTrace(); } } return elements; }
/** Find a "relatively" unused disk element, but not the element just added. */ private DiskElement findRelativelyUnused() { LfuPolicy.Metadata[] elements = sampleElements(diskElements); LfuPolicy.Metadata metadata = LfuPolicy.leastHit(elements, null); return (DiskElement) metadata; }