かなり大きなファイル(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)
memcached FAQ には2つのエントリがあります。
最初の答えは(quoting、emphasis mine)です。
memcachedに保存できる値の最大サイズは1メガバイトです。データが大きい場合は、クライアント側の圧縮または値を複数のキーに分割することを検討してください。
だから私はあなたの11MBファイルが1つのmemcachedエントリに収まるには大きすぎると思います。
他の回答のとおり、オブジェクトのサイズを大きくすることは可能です。
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
必要な手順を要約するには:
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を更新する場合は、このハックをもう一度行う必要がありますが、これは非常にシンプルで迅速な修正です。
最大データサイズはアイテムあたり1 MBです
更新:これは2009年の回答です。そしてその日、情報は正確で、出典は公式でした。現在、2014年にmemcachedは1mbではなく128mbを格納できます(ただし、開発者は公式FAQを更新する必要がありませんでした)。誰かが唯一の参照として、おそらく1年で死んでしまうであろうあいまいなページを見つけることができます。
質問のこの部分に誰も対処していないようです:
ディスクから何度も読み取る必要はなく、memcachedに保存することを考えました(これが適切でない場合は、お知らせください)。
これは良い考えではありません。最新のファイルシステムはすべて、効率的なキャッシュメカニズムを備えています。数秒前に読み取られたディスクからのファイルの読み取りは、通常、引き続きメモリキャッシュに残ります。これは、ネットワーク経由でmemcachedにアクセスするよりもはるかに高速です。
127.0.0.1でmemcachedを実行している場合、要求されたメモリはその単一のファイルにのみ使用されます。オペレーティングシステムのキャッシュに単に依存しているかのように、メモリは、手元のジョブに応じてさまざまな目的に使用できます。
次の記事では、単一ファイルの最大サイズが1Mに制限される理由を説明しています。
http://www.mikeperham.com/2009/06/22/slabs-pages-chunks-and-memcached/
基本的に、memcacheにはメモリページの小さな断片があり、その中にオブジェクトが存在します。
また、デフォルトのページサイズは1Mと思われるため、ページに含めることができるオブジェクトの最大数は1Mに制限されています。
サイズを増やすように構成することもできますが、これには何らかのパフォーマンスのトレードオフがあると思います。
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