0

大きな値をサポートするように memcached を設定する手順に従っています。

ユースケースは基本的に、かなり大きな機械学習モデルをメモリに保持し、それを使用してクエリに応答することです。モデルのサイズは、0.5 ~ 100 MB の間で変動する場合があります。

これらは、私の /etc/memcached.conf のカスタム キーです。

# custom flags
-I 10M
-m 200
-vvv

memcached の再起動後に設定されたキーは次のとおりです。

> sudo service memcached restart
Restarting memcached: memcached.
> echo "stats settings" | nc localhost 11211
STAT maxbytes 67108864
STAT maxconns 1024
STAT tcpport 11211
STAT udpport 11211
STAT inter 127.0.0.1
STAT verbosity 3
STAT oldest 0
STAT evictions on
STAT domain_socket NULL
STAT umask 700
STAT growth_factor 1.25
STAT chunk_size 48
STAT num_threads 4
STAT num_threads_per_udp 4
STAT stat_key_prefix :
STAT detail_enabled no
STAT reqs_per_event 20
STAT cas_enabled yes
STAT tcp_backlog 1024
STAT binding_protocol auto-negotiate
STAT auth_enabled_sasl no
STAT item_size_max 10485760
STAT maxconns_fast no
STAT hashpower_init 0
STAT slab_reassign no
STAT slab_automove no
END

したがって、良いニュースと悪いニュースがあるようです。ITEMSIZEMAX は約 10 MB に変更されましたが、maxbytes はデフォルトの 67 MB のままです。

本当の問題は、まだ 1 MB を超えるキーを保存できないことです!

次の Python スクリプトを実行すると、サイズが ~0.4 MB の numpy 配列を格納しようとすると失敗します

from django.core.management import setup_environ
from myapp import settings
setup_environ(settings)

key = "test_key"

def store_test(val):
 cache.set(key, val)
 if cache.get(key) is not None:
  cache.delete(key)
  return True
 else:
  return False

from django.core.cache import cache
from numpy import arange

i = 10
while i <= 1000000:
 yes = store_test(arange(i))
 if yes:
        print "stored", i, "successfully"
 else:
        print "failed to store", i
        print "bytes:", arange(i).nbytes
 i *= 10

もちろん、このコードを実行するには、'myapp' を settings.py ファイルを含む有効な Django モジュールに置き換える必要があります。

誰でも問題を再現したり、デバッグを手伝ったり、解決策を提案したりできますか?

**編集**

Python を経由する代わりに memcached を直接テストする bash スクリプトを作成しましたが、奇妙なことに、うまくいくようです!

for i in 10 1000 10000 100000 1000000 2000000 10000000 11000000
do
        bytes=$(yes | head -n $i | tr -d '\n')
        echo doing $i bytes
        (echo delete key; echo set key 0 900 $i; echo $bytes; echo get key; sleep 1) | telnet localhost 11211 > output_$i
        outputsize=$(stat -c%s "output_$i")
        echo output size is $outputsize - should be about $(($i+110))
done
echo delete key | telnet localhost 11211
~                                         
4

1 に答える 1

1

そのため、以前は見つけられなかったようですが、どうやらこの質問はすでに回答されているようです。

Django が大きなリストをキャッシュする

問題は、memcached と Django の memcached バインディングの両方が 1 MB の制限を設定していることです。これはバグだと確信しています - Python バインディングは memcached の実際の構成を尊重する必要があります。どうやら、新しい値を組み込む必要があります。

于 2013-08-11T06:27:47.677 に答える