memcache.py로 memcached에 저장할 수있는 최대 크기
문제
사용자에게 다소 큰 파일 (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입니다
업데이트 : 이것은 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를 실행중인 경우, 주장 된 메모리는 단일 파일에만 사용됩니다. 단순히 운영 체제의 캐싱에 의존하는 경우 메모리는 당면한 작업에 따라 다양한 목적으로 사용될 수 있습니다.