문제

사용자에게 다소 큰 파일 (11MB)을 반환해야합니다. 어떤 이유로, 파일에 직접 URL을 제공 할 수는 없습니다 (http://www.sample.com/mybigfile.exe); 대신 코드를 통해 액세스해야합니다.

디스크에서 반복해서 읽지 않고 Memcached로 저장하는 것을 생각했습니다 (이것이 좋은 생각이 아니라면 알려주세요). 모든 것이 잘 작동하는 것처럼 보이지만 (오류 없음) Memcached에서 파일을 검색하려고 할 때 파일이 캐시되지 않은 것처럼 항상 얻지 못합니다.

저장할 수있는 것에 대한 크기 제한이 있습니까?

코드는 다음과 같습니다.

def download_demo():
    """
    Returns the demo file
    """
    KEY = "xyz"
    TIME = 86400 #24 hours

    buff = memc.get(KEY)
    if not buff: 
        file = open(FILENAME, 'r')
        buff = file.read()
        memc.set(KEY, buff, TIME)

    print "Content-Type:application/x-download\nContent-Disposition:attachment;filename=%s\nContent-Length:%s\n\n%s" %    (os.path.split(FILENAME)[-1], len(buff), buff)
도움이 되었습니까?

해결책

그것에 대한 두 가지 항목이 있습니다 Memcached FAQ :

첫 번째 대답은입니다 (인용, 강조 광산) :

Memcached에 저장할 수있는 값의 최대 크기는 1 메가 바이트입니다.. 데이터가 더 크면 ClientSide 압축 또는 값을 여러 키로 분할하는 것을 고려하십시오.

그래서 나는 당신의 11MB 파일이 하나의 memcached 항목에 맞지 않기에는 너무 큰 것 같습니다.

다른 답변에 따라 물체의 크기를 늘리는 것이 가능합니다.

다른 팁

Memcache 1.4.2에서 이것은 사용자가 구성 가능한 매개 변수입니다. Releasenotes142 * memcached @ github

구성 가능한 최대 항목 크기

많은 사람들이 1MB보다 큰 품목을 보관할 수 있도록 Memcached를 요청했지만 일반적으로 ~ 아니다 이렇게하면 이제 명령 선에서 지원됩니다.

깨달은 몇몇 사람들은 또한 최대 품목 크기를 줄이기 위해 memcached를 요청했습니다. 그것은 또한 옵션입니다.

새로운 -I 매개 변수를 사용하면 런타임에 최대 항목 크기를 지정할 수 있습니다. 항목 크기의 자연스러운 표현을 허용하기 위해 유닛 포스트 픽스를 지원합니다.

예 :

memcached -I 128k # Refuse items larger than 128k. 
memcached -I 10m  # Allow objects up to 10MB

필요한 단계를 요약하기 위해 :

1) Memcache를 버전 1.4.2 이상으로 업데이트하십시오.

2) Memcache Run 명령에 플래그 -i 15m (또는 많은 메가 바이트)를 추가하십시오.

그것은 명령 줄이거나 우분투에서 라인을 추가합니다.

-I 15M

/etc/memcached.conf의 어느 곳에서나 서비스를 다시 시작하십시오.

3) Memcache의 클라이언트에 필요한 플래그를 추가하십시오.

import memcache
memc = memcache.Client(['localhost'], server_max_value_length=1024*1024*15)
memc.set(KEY, buff, TIME)

Memcache 클라이언트 (즉, 프레임 워크를 통해 작동)에 직접 액세스 할 수없는 경우 Memcache 코드를 직접 해킹하십시오.

Ubuntu에서는 /usr/local/lib/python2.7/dist-packages/memcache.py입니다. 라인 변경 :

SERVER_MAX_ITEM_LENGTH = 1024 * 1024 

에게

SERVER_MAX_ITEM_LENGTH = 1024 * 1024 * 15

분명히 Memcache를 업데이트하면이 해킹을 다시 수행해야하지만 매우 간단하고 빠른 수정입니다.

최대 데이터 크기는 항목 당 1MB입니다

http://code.google.com/p/memcached/wiki/faq#what_is_the_thaxum_data_size_you_can_store?_%281_megabyte%29

업데이트 : 이것은 2009 년 답변입니다. 그리고 그 날짜에 정보는 정확했고 출처는 공식적이었습니다. 이제 2014 년에 Memcached는 1MB 대신 128MB를 저장할 수 있습니다 (그러나 개발자는 공식 FAQ를 업데이트하지 않았습니다). 유일한 참조는 누군가가 1 년 안에 죽을 모호한 페이지를 찾을 수 있습니다.

다음 기사에 따르면 단일 파일의 최대 크기를 1m으로 제한하는 이유가 설명되었습니다.

http://www.mikeperham.com/2009/06/22/slabs-pages-chunks-and-memcached/

기본적으로 Memcache에는 작은 메모리 페이지가 있으며 내부에는 객체가 있습니다.

기본 페이지 크기는 1m 인 것처럼 보이므로 페이지가 포함 할 수있는 최대 개체는 1m으로 제한됩니다.

크기를 늘리도록 구성 할 수는 있지만 이것이 어떤 종류의 성능 트레이드 오프가있을 수 있다고 생각합니다.

Python Memcached Client를 사용하는 경우 Memcached Server와 함께 Client Memcache.py 파일의 한도를 늘리십시오.

~/anaconda/lib/python2.7/site-packages/memcache.py

SERVER_MAX_KEY_LENGTH = 250 
SERVER_MAX_VALUE_LENGTH = 1024 * 1024 * 15

Memcached Console (Telnet LocalHost 11211)에서 볼 수 있습니다.

통계 슬래브 스탯 48 : chunk_size 3677344

아무도이 문제 의이 부분을 다루지 않는 것 같습니다.

디스크에서 반복해서 읽지 않고 Memcached로 저장하는 것을 생각했습니다 (이것이 좋은 생각이 아니라면 알려주세요).

이것은 좋은 생각이 아닙니다. 모든 최신 파일 시스템에는 효율적인 캐싱 메커니즘이 있습니다. 몇 초 전에 읽은 디스크에서 파일을 읽는 것은 일반적으로 메모리 캐시에 있습니다. 이것은 네트워크를 통해 memcached에 액세스하는 것보다 훨씬 빠릅니다.

127.0.0.1에 memcached를 실행중인 경우, 주장 된 메모리는 단일 파일에만 사용됩니다. 단순히 운영 체제의 캐싱에 의존하는 경우 메모리는 당면한 작업에 따라 다양한 목적으로 사용될 수 있습니다.

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