복붙노트

[HADOOP] java.util.Map의 드롭 인 대체품 찾기

HADOOP

java.util.Map의 드롭 인 대체품 찾기

이 질문에 따라 파일 또는 디스크 기반 Map 구현이 내가 언급 한 문제에 대한 올바른 해결책이 될 수 있습니다. 짧은 버전 :

직장에서 SQLite를 사용하여이 문제를 해결할 것을 강력하게 제안했지만, 이전 질문을 한 후에 데이터베이스가이 작업에 적합한 도구라고 생각하지 않습니다. 그래서 -이게 미친 소리인지 알려주세요 - 더 나은 솔루션은 디스크에 저장된지도라고 생각합니다.

나쁜 생각 : 직접 구현하십시오. 더 나은 아이디어 : 다른 사람의 도서관을 사용하십시오! 어느 것?

Ehcache와 Berkeley DB는 모두 합리적으로 보입니다. 어느 방향 으로든 어떤 특별한 권고 사항이 있습니까?

해결법

  1. ==============================

    1.업데이트 (첫 번째 게시물 이후 약 4 년 ...) : 최신 버전의 ehcache에서 캐시 항목의 지속성은 유료 제품에서만 사용할 수 있습니다. 이 문제를 지적 해 주셔서 감사합니다.

    업데이트 (첫 번째 게시물 이후 약 4 년 ...) : 최신 버전의 ehcache에서 캐시 항목의 지속성은 유료 제품에서만 사용할 수 있습니다. 이 문제를 지적 해 주셔서 감사합니다.

    ehcache는 훌륭합니다. 디스크에 스필 오버 (spillover) 기능을 사용하여 메모리, 디스크 또는 메모리에 맵을 구현하는 데 필요한 유연성을 제공합니다. java.util.Map에 대한이 매우 간단한 래퍼를 사용하면 블링킹으로 간단합니다.

    import java.util.Collection;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    import net.sf.ehcache.Cache;
    import net.sf.ehcache.Element;
    
    import org.apache.log4j.Logger;
    
    import com.google.common.collect.Sets;
    
    public class EhCacheMapAdapter<K,V> implements Map<K,V> {
        @SuppressWarnings("unused")
        private final static Logger logger = Logger
                .getLogger(EhCacheMapAdapter.class);
    
        public Cache ehCache;
    
        public EhCacheMapAdapter(Cache ehCache) {
            super();
            this.ehCache = ehCache;
        } // end constructor
    
        @Override
        public void clear() {
            ehCache.removeAll();
        } // end method
    
        @Override
        public boolean containsKey(Object key) {
            return ehCache.isKeyInCache(key);
        } // end method
    
        @Override
        public boolean containsValue(Object value) {
            return ehCache.isValueInCache(value);
        } // end method
    
        @Override
        public Set<Entry<K, V>> entrySet() {
            throw new UnsupportedOperationException();
        } // end method
    
        @SuppressWarnings("unchecked")
        @Override
        public V get(Object key) {
            if( key == null ) return null;
            Element element = ehCache.get(key);
            if( element == null ) return null;
            return (V)element.getObjectValue();
        } // end method
    
        @Override
        public boolean isEmpty() {
            return ehCache.getSize() == 0;
        } // end method
    
        @SuppressWarnings("unchecked")
        @Override
        public Set<K> keySet() {
            List<K> l = ehCache.getKeys();
            return Sets.newHashSet(l);
        } // end method
    
        @SuppressWarnings("unchecked")
        @Override
        public V put(K key, V value) {
            Object o = this.get(key);
            if( o != null ) return (V)o;
            Element e = new Element(key,value);
            ehCache.put(e);
            return null;
        } // end method
    
    
        @Override
        public V remove(Object key) {
            V retObj = null;
            if( this.containsKey(key) ) {
                retObj = this.get(key);
            } // end if
            ehCache.remove(key);
            return retObj;
        } // end method
    
        @Override
        public int size() {
            return ehCache.getSize();
        } // end method
    
        @Override
        public Collection<V> values() {
            throw new UnsupportedOperationException();
        } // end method
    
        @Override
        public void putAll(Map<? extends K, ? extends V> m) {
            for( K key : m.keySet() ) {
                this.put(key, m.get(key));
            } // end for
        } // end method
    } // end class
    
  2. ==============================

    2.보급 프레임 워크에 대해 들어 본 적이 없습니까?

    보급 프레임 워크에 대해 들어 본 적이 없습니까?

    이 용어에 대한 몇 가지 설명을 편집하십시오.

    제임스 고슬링 (James Gosling)이 말했듯이, SQL DB는 메모리 내 저장만큼 효율적이지 않습니다. 보급 프레임 워크 (prevayler 및 space4j로 가장 많이 알려져 있음)는 디스크, 스토리지에 저장 될 수있는 메모리 내 아이디어에 기반합니다. 어떻게 작동합니까? 사실 저장소 객체는 모든 영속 엔티티를 포함합니다. 이 스토리지는 직렬화 가능 조작으로 만 변경 될 수 있습니다. 결과적으로 오브젝트를 저장 영역에 두는 것은 분리 된 컨텍스트에서 수행되는 Put 조작입니다. 이 작업은 직렬화 가능하기 때문에 장기간 지속성을 위해 디스크에 저장 될 수도 있습니다 (구성에 따라 다름). 그러나 주요 데이터 저장소는 높은 메모리 사용량을 희생하면서도 의심의 여지없이 빠른 액세스 시간을 자랑하는 메모리입니다.

    또 다른 장점은 명백한 단순성 때문에 이러한 프레임 워크는 클래스의 10 분의 1 이상을 거의 포함하지 않는다는 것입니다

    귀하의 질문을 고려하면, Space4J의 사용은 즉시 마음에 들었습니다. (거의 사용되지 않는 객체의 "패시베이션"을 지원합니다. 즉, 색인 키가 메모리에 있지만 객체는 디스크에 보관됩니다. 사용되지 않음).

    c2wiki에서 일부 정보를 찾을 수 있습니다.

  3. ==============================

    3.Berkeley DB Java Edition에는 Collections API가 있습니다. 이 API 내에서 특히 StoredMap은 ConcurrentHashMap을 대체합니다. StoredMap을 만들기 전에 환경과 데이터베이스를 만들어야하지만 Collections 튜토리얼을 통해 쉽게 이해할 수 있습니다.

    Berkeley DB Java Edition에는 Collections API가 있습니다. 이 API 내에서 특히 StoredMap은 ConcurrentHashMap을 대체합니다. StoredMap을 만들기 전에 환경과 데이터베이스를 만들어야하지만 Collections 튜토리얼을 통해 쉽게 이해할 수 있습니다.

    귀하의 요구 사항에 따라 Berkeley DB는 사용하기 쉽도록 설계되었으며 탁월한 확장 성과 성능을 제공합니다. 버클리 DB는 오픈 소스 라이센스하에 제공되며, 플랫폼에 독립적이며 지속적으로 데이터를 검색 할 수 있습니다. 필요에 따라 데이터를 확실하게 제거 / 삭제할 수 있습니다. Berkeley DB는 응용 프로그램의 유용성, 특히 응용 프로그램의 성공에 따라 요구 사항이 변경되고 커질 수있는 많은 기능을 제공합니다.

    Berkeley DB Java Edition을 사용하기로 결정했다면, BDB JE Forum에서 질문하십시오. 질문에 답하고 문제를 해결하는 데 도움을주는 적극적인 개발자 커뮤니티가 있습니다.

  4. ==============================

    4.우리는 Xapian을 사용하여 유사한 솔루션을 구현했습니다. 빠르며 확장 성이 뛰어나며 요청한 거의 모든 검색 기능을 제공하며 무료이며 멀티 플랫폼이며 물론 삭제가 가능합니다.

    우리는 Xapian을 사용하여 유사한 솔루션을 구현했습니다. 빠르며 확장 성이 뛰어나며 요청한 거의 모든 검색 기능을 제공하며 무료이며 멀티 플랫폼이며 물론 삭제가 가능합니다.

  5. ==============================

    5.몇 주 전에 jdbm2에서 건너 왔습니다. 사용법은 매우 간단합니다. 당신은 30 분 안에 그것을 작동시킬 수 있어야합니다. 한 가지 단점은지도에 삽입되는 객체가 직렬화 가능해야한다는 것입니다. 즉 직렬화 가능을 구현해야합니다. 다른 단점은 그들의 웹 사이트에서 주어진다.

    몇 주 전에 jdbm2에서 건너 왔습니다. 사용법은 매우 간단합니다. 당신은 30 분 안에 그것을 작동시킬 수 있어야합니다. 한 가지 단점은지도에 삽입되는 객체가 직렬화 가능해야한다는 것입니다. 즉 직렬화 가능을 구현해야합니다. 다른 단점은 그들의 웹 사이트에서 주어진다.

    그러나 모든 오브젝트 지속성 데이터베이스는 사용자가 소유 한 Java 클래스의 오브젝트를 저장하기위한 영구적 인 솔루션이 아닙니다. 클래스의 필드를 변경하기로 결정한 경우 더 이상지도 콜렉션에서 객체를 참조 할 수 없게됩니다. String, Integer 등의 표준 직렬화 가능한 클래스를 저장하는 것이 이상적입니다.

  6. ==============================

    6.http://code.google.com/p/guava-libraries/의 일부인 google-collections 라이브러리에는 정말 유용한지도 도구가 있습니다. 특히 MapMaker를 사용하면 시간이있는 축출을 사용하여 동시 HashMap을 만들 수 있으며, 힙이 부족한 경우 가비지 수집기에서 스윕 할 부드러운 값과 계산 기능을 사용할 수 있습니다.

    http://code.google.com/p/guava-libraries/의 일부인 google-collections 라이브러리에는 정말 유용한지도 도구가 있습니다. 특히 MapMaker를 사용하면 시간이있는 축출을 사용하여 동시 HashMap을 만들 수 있으며, 힙이 부족한 경우 가비지 수집기에서 스윕 할 부드러운 값과 계산 기능을 사용할 수 있습니다.

    Map<String, String> cache = new MapMaker()
        .softValues()
        .expiration(30, TimeUnit.MINUTES)
        .makeComputingMap(new Function<String, String>() {
            @Override
            public String apply(String input) {
                // Work out what the value should be
                return null;
            }
        });
    

    그러면 자체적으로 정리하고 값을 처리 할 수있는 Map 캐시가 제공됩니다. 그런 다음 그 값을 계산할 수 있다면 위대하다. 그렇지 않으면 http://redis.io/에 완벽하게 매핑된다. (공정하게 말하자면, 충분히 빨라야한다.) .

  7. from https://stackoverflow.com/questions/4726370/looking-for-a-drop-in-replacement-for-a-java-util-map by cc-by-sa and MIT license