web-dev-qa-db-ja.com

memcache.pyを使用してmemcachedに保存できるオブジェクトの最大サイズ

かなり大きなファイル(11MB)をユーザーに返す必要があります。特定の理由により、ファイルに直接URL( http://www.sample.com/mybigfile.exe )を提供することはできません。代わりに、コードを介してアクセスする必要があります。

ディスクから何度も読み取る必要はなく、memcachedに保存することを考えました(これが適切でない場合は、お知らせください)。すべて正常に動作しているようですが(エラーはありません)、memcachedからファイルを取得しようとすると、ファイルがキャッシュされていないかのように、常にNoneが表示されます。

保存できるサイズに制限はありますか?

コードは次のとおりです。

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)
26
cfischer

memcached FAQ には2つのエントリがあります。

最初の答えは(quoting、emphasis mine)です。

memcachedに保存できる値の最大サイズは1メガバイトです。データが大きい場合は、クライアント側の圧縮または値を複数のキーに分割することを検討してください。

だから私はあなたの11MBファイルが1つのmemcachedエントリに収まるには大きすぎると思います。

他の回答のとおり、オブジェクトのサイズを大きくすることは可能です。

32
Pascal MARTIN

Memcache 1.4.2以降、これはユーザーが構成可能なパラメーターです: ReleaseNotes142 * memcached @ Github

構成可能な最大アイテムサイズ

多くの人がmemcachedに1MBを超えるアイテムを保存できるようにしたいと言っていますが、一般的には1つしないでくださいこれを行うことをお勧めします。コマンドライン。

いくつかの賢明な人々は、最大アイテムサイズを減らすためにmemcachedを要求しました。それもオプションです。

新しい-Iパラメータを使用すると、実行時の最大アイテムサイズを指定できます。アイテムのサイズを自然に表現できるようにするために、ユニットの接尾辞をサポートしています。

例:

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

必要な手順を要約するには:

1)Memcacheをバージョン1.4.2以降に更新します。

2)memcache runコマンドにフラグ-I 15M(または数メガバイト)を追加します。

それはコマンドラインです、またはUbuntuでは、行を追加します

-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を更新する場合は、このハックをもう一度行う必要がありますが、これは非常にシンプルで迅速な修正です。

22
Alex

最大データサイズはアイテムあたり1 MBです

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

更新:これは2009年の回答です。そしてその日、情報は正確で、出典は公式でした。現在、2014年にmemcachedは1mbではなく128mbを格納できます(ただし、開発者は公式FAQを更新する必要がありませんでした)。誰かが唯一の参照として、おそらく1年で死んでしまうであろうあいまいなページを見つけることができます。

2

質問のこの部分に誰も対処していないようです:

ディスクから何度も読み取る必要はなく、memcachedに保存することを考えました(これが適切でない場合は、お知らせください)。

これは良い考えではありません。最新のファイルシステムはすべて、効率的なキャッシュメカニズムを備えています。数秒前に読み取られたディスクからのファイルの読み取りは、通常、引き続きメモリキャッシュに残ります。これは、ネットワーク経由でmemcachedにアクセスするよりもはるかに高速です。

127.0.0.1でmemcachedを実行している場合、要求されたメモリはその単一のファイルにのみ使用されます。オペレーティングシステムのキャッシュに単に依存しているかのように、メモリは、手元のジョブに応じてさまざまな目的に使用できます。

1
Jason Smith

次の記事では、単一ファイルの最大サイズが1Mに制限される理由を説明しています。

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

基本的に、memcacheにはメモリページの小さな断片があり、その中にオブジェクトが存在します。

また、デフォルトのページサイズは1Mと思われるため、ページに含めることができるオブジェクトの最大数は1Mに制限されています。

サイズを増やすように構成することもできますが、これには何らかのパフォーマンスのトレードオフがあると思います。

1
Eric Wang

python memcachedクライアントを使用している場合は、memcachedサーバーとともにクライアントのmemcache.pyファイルの制限も増やすようにしてください。

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

SERVER_MAX_KEY_LENGTH = 250 
SERVER_MAX_VALUE_LENGTH = 1024 * 1024 * 15

memcachedコンソール(telnet localhost 11211)で確認できます

stats slabs STAT 48:chunk_size 3677344

1
Pari Rajaram