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 模块。

任何人都可以复制这个问题,帮我调试这个,或者提出一个解决方案吗?

**编辑**

我编写了一个 bash 脚本来直接测试 memcached,而不是通过 Python,奇怪的是它似乎可以工作!

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 回答