복붙노트

[REDIS] 데이터보다 10 배 더 많은 메모리 사용량을 레디 스

REDIS

데이터보다 10 배 더 많은 메모리 사용량을 레디 스

나는 작은 질문이있다.

나는 레디 스에서 단어 목록을 저장하려합니다. 성능은 아주 좋습니다.

나의 접근 방식은 "단어"라는 설정을하고 '사드'를 통해 각각의 새로운 단어를 추가하는 것입니다.

여기 15.9mb 그게 파일을 추가하고 레디 스 서버 프로세스가 소비의 RAM 160MB 단어 만 약이 들어있는 문제입니다. 내가 메모리를 10 배 사용하고 어떻게 와서이 문제를 접근하는 더 좋은 방법은 무엇입니까?

미리 감사드립니다

해결법

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

    1.음이 어떤 효율적인 데이터 저장 예상된다 단어 포인터로 연결된 셀의 동적 데이터 구조로 메모리에 색인화한다. 구조 메타 데이터 포인터와 메모리 할당 내부 분열의 크기는 데이터가 해당 플랫 파일보다 훨씬 더 많은 메모리를 가지고 이유입니다.

    음이 어떤 효율적인 데이터 저장 예상된다 단어 포인터로 연결된 셀의 동적 데이터 구조로 메모리에 색인화한다. 구조 메타 데이터 포인터와 메모리 할당 내부 분열의 크기는 데이터가 해당 플랫 파일보다 훨씬 더 많은 메모리를 가지고 이유입니다.

    레디 스 세트는 해시 테이블로 구현됩니다. 여기에는 다음이 포함됩니다 :

    모든 위의 크기는 64 비트로 구현 주어진다. 메모리 할당 오버 헤드를 차지가 레디 스가 jemalloc 할당을 사용 레디 스의 최신 버전 (데이터의 상부에) 일련의 항목 당 적어도 64 바이트 복용 결과 (> = 2.4)

    레디 스 일부 데이터 유형에 대한 메모리 최적화를 제공하지만, 그들은 문자열의 집합을 포함하지 않습니다. 당신이 정말로 세트의 최적화 메모리 소비해야하는 경우가 있지만 사용할 수있는 트릭이있다. 나는 RAM의 단지 1백60메가바이트 위해이 작업을 수행 할 것입니다,하지만 당신은 여기에 당신이 할 수있는 무엇, 큰 데이터가 있어야합니다.

    당신은 노동 조합, 교차로, 세트의 차이 기능이 필요하지 않는 경우에, 당신은 해시 객체에서 단어를 저장할 수 있습니다. 이점은 충분히 작은 경우 해시 객체가 zipmap를 사용 레디 스에 의해 자동으로 최적화 할 수 있습니다. zipmap기구 레디 스> = 2.6 ziplist로 대체하지만, 아이디어는 동일되었습니다 성능 및 소형 메모리 용량 모두를 얻기 위해 CPU 캐시에 들어있는 일련의 데이터 구조를 사용.

    해시 객체가 충분히 작은 보장하기 위해, 데이터는 일부 해싱 메커니즘에 따라 배포 될 수 있습니다. 단어를 추가하면 다음과 같은 방식으로 구현 될 수있다, 당신은 1M 항목을 저장할 필요가 가정 :

    대신 저장 :

    words => set{ hi, hello, greetings, howdy, bonjour, salut, ... }
    

    당신은 저장할 수 있습니다 :

    words:H1 => map{ hi:1, greetings:1, bonjour:1, ... }
    words:H2 => map{ hello:1, howdy:1, salut:1, ... }
    ...
    

    검색하거나 단어의 존재를 확인하려면, 같은 (그것을 사용 HGET 또는 HEXISTS 해시)입니다.

    이 전략을 통해 상당한 메모리 절약이 해시의 모듈이 제공 할 수 있습니다 (레디 스> = 2.6 또는 ziplist)를 zipmap 구성에 따라 선택 :

    # Hashes are encoded in a special way (much more memory efficient) when they
    # have at max a given number of elements, and the biggest element does not
    # exceed a given threshold. You can configure this limits with the following
    # configuration directives.
    hash-max-zipmap-entries 512
    hash-max-zipmap-value 64
    

    주의 : 이러한 매개 변수의 이름 레디 스> = 2.6으로 변경되었습니다.

    여기에, 1M 항목 수단 모두가 zipmaps / ziplists로 저장되는 것을 보장합니다 해시 개체 당 100 개 항목, 10000 모듈로.

  2. ==============================

    2.내 실험에 관해서는, 해시 테이블 / 사전 내부에 데이터를 저장하는 것이 좋습니다. 내가 벤치마킹을 많이 도달 한 후에 최고의 적 사건은 500 개 키를 초과하지 않는 당신의 해시 테이블 데이터 항목 내부에 저장하는 것입니다.

    내 실험에 관해서는, 해시 테이블 / 사전 내부에 데이터를 저장하는 것이 좋습니다. 내가 벤치마킹을 많이 도달 한 후에 최고의 적 사건은 500 개 키를 초과하지 않는 당신의 해시 테이블 데이터 항목 내부에 저장하는 것입니다.

    내가 100 만 키 / 값을 얻을 / 표준 문자열 세트를 시도, 크기 79 메가 바이트했다. 당신은 약 8 GB의 사용 100 개 수백만 같은 큰 숫자가있는 경우이 경우 매우 크다.

    나는 크기가 16메가바이트 점점 더 작고, 같은 만 키 / 값, 동일한 데이터를 저장하기 위해 해시를 시도했다.

    누군가가 벤치마킹 코드를 필요로하는 경우 경우에 시도를 가지고, 나에게 메일을 드롭

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

    3.당신은 아래로 서버를 종료하고 백업 받고, 데이터베이스 (예를 들어 BGSAVE)을 지속하려고 했습니까? 그것은 다시 나타나고 저장된 RDB 파일에서 데이터를 채 웁니다 분열 행위로 인해, 그것은 메모리를 적게 걸릴 수 있습니다.

    당신은 아래로 서버를 종료하고 백업 받고, 데이터베이스 (예를 들어 BGSAVE)을 지속하려고 했습니까? 그것은 다시 나타나고 저장된 RDB 파일에서 데이터를 채 웁니다 분열 행위로 인해, 그것은 메모리를 적게 걸릴 수 있습니다.

    또한 : 당신에게 무엇 레디 스 버전에서 작동? 이 블로그 게시물에서보세요 - 그것은 그 조각이 부분적으로 버전 2.4으로 해결했다고 밝혔다.

  4. from https://stackoverflow.com/questions/10004565/redis-10x-more-memory-usage-than-data by cc-by-sa and MIT license