문제

나는 실제로 10.000.000의 용량과 .75의 하중 계수로 실제로 구축 된 큰 (수백만) 해시 맵으로 Java를 닦고 있으며 일부 값을 캐시하는 데 사용됩니다.

캐시 된 값은 시간이 지남에 따라 쓸모 없게되므로 (더 이상 액세스되지 않음) 쓸모없는 값을 제거 할 수는 없습니다. 언제 잘하는지 어떻게 결정할 수 있습니까?

예를 들어, 10 백만 용량과 .75로 7.5 백만의 요소에 도달하면 비워야합니까? 다양한 임계 값을 시도했지만 분석 값을 갖고 싶습니다.

나는 이미 가득 차있을 때 그것을 emping하는 사실을 이미 테스트했다.

편집 : 추가 정보

해시 맵은 키와 함께 길고 값으로 플로트합니다. 캐시 된 내용의 상관 관계가 포함되어 있습니다. 왜냐하면 나는 캐시를 캐시하고 싶었던 태그 벡터의 도트 제품이기 때문에 (성능을 높이기 위해).

기본적으로 내가하는 일은 a를 계산하는 것입니다 long 두 내용의 해시 코드를 사용한 키 :

static private long computeKey(Object o1, Object o2)
{
    int h1 = o1.hashCode();
    int h2 = o2.hashCode();

    if (h1 < h2)
    {
        int swap = h1;
        h1 = h2;
        h2 = swap;
    }

    return ((long)h1) << 32 | h2;
}

저장된 값을 검색하는 데 사용하십시오. 일어나는 일은 계층 적 클러스터링 내용이 병합되고 다른 내용과의 상관 관계 값이 더 이상 필요하지 않기 때문에, 그럼에도 불구하고 해시 맵을 때때로 닦아 내고 싶지 않습니다.

사용 a WeakHashMap 아직 필요할 때도 예측할 수 없을 정도로 데이터를 제거 할 것입니다. 나는 그것을 통제 할 수 없습니다.

감사

도움이 되었습니까?

해결책

LRU 캐시를 사용하지 않는 이유는 무엇입니까? Java의 Linkedhashmap 문서 :

반복 순서가 링크 된 해시 맵을 만들기 위해 특수 생성자가 제공됩니다. 반복 순서는 입력이 마지막으로 액세스 한 순서가 가장 적게 액세스 한 것부터 가장 재생 (액세스 주문)에 이르기까지 제공됩니다. 이런 종류의지도는 LRU 캐시를 구축하는 데 적합합니다. PUT 또는 GET 메소드를 호출하면 해당 항목에 액세스 할 수 있습니다 (호출이 완료된 후 존재한다고 가정). PutAll 메소드는 지정된 맵의 입력 세트 반복자가 키 값 매핑을 제공하는 순서대로 지정된 맵에서 각 맵핑에 대해 하나의 항목 액세스를 생성합니다. 다른 방법은 입력 액세스를 생성하지 않습니다. 특히, 컬렉션 뷰에서의 작업은 백킹 맵의 반복 순서에 영향을 미치지 않습니다.

따라서 기본적으로 맵이 너무 커짐에 따라 가끔씩, 반복자가 제공하는 첫 번째 x 값을 삭제하십시오.

문서를 참조하십시오 removeEldestEntry 이 작업을 자동으로 수행합니다.

다음은 다음과 같은 코드입니다.

 public static void main(String[] args) {
    class CacheMap extends LinkedHashMap{
      private int maxCapacity;
      public CacheMap(int initialCapacity, int maxCapacity) {
        super(initialCapacity, 0.75f, true);
        this.maxCapacity = maxCapacity;
      }

      @Override
      protected boolean removeEldestEntry(Map.Entry eldest) {
        return size()>maxCapacity;
      }
    }

    int[] popular = {1,2,3,4,5};
    CacheMap myCache = new CacheMap(5, 10);
    for (int i=0; i<100; i++){
      myCache.put(i,i);
      for (int p : popular) {
        myCache.get(p);
      }
    }

    System.out.println(myCache.toString()); 
    //{95=95, 96=96, 97=97, 98=98, 99=99, 1=1, 2=2, 3=3, 4=4, 5=5}
  }

다른 팁

조사 했습니까? 약한 해쉬 맵 ? 쓰레기 수집가는 물건을 제거 할시기를 결정할 수 있으며 스스로 무언가를 코딩하기보다는 허용 가능한 대체물을 줄 수 있습니다.

이 기사 더 유용한 정보가 있습니다.

Google 컬렉션을 사용하고 싶을 수도 있습니다. 맵 메이커 소프트 참조와 특정 시간 초과로지도를 만듭니다.

소프트 참고 문헌은 "메모리 수요에 대한 응답으로 쓰레기 수집기의 재량에 따라 청소됩니다."

예시:

ConcurrentMap<Long, ValueTypeHere> cacheMap = new MapMaker()
    .concurrencyLevel(32)
    .softValues()
    .expiration(30, TimeUnit.MINUTES)
    .makeMap();

키가 약한 해쉬 맵에서 키를 작동 시키려면 약점을 지정할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top