hym*_*oth 8 python optimization redis
我试图在Redis端以非常高效的方式编码一些数据(实际上是一个非常大的字符串).根据Redis文档,声称"尽可能使用散列",并声明了两个配置参数:
"hash-max-zipmap-entries",如果我理解的话它表示每个哈希键最多必须有多少个键(我是对的吗?).
"hash-max-zipmap-value",表示值的最大长度.它实际上是指领域还是价值?长度是以字节,字符还是什么?
我的想法是将字符串(以某种方式具有固定长度)分割成与上述参数一致的数量,并将它们存储为值.字段应该只是序列号,以确保一致的解码.
编辑:我已经进行了广泛的基准测试,看起来在哈希中编码字符串会使内存消耗增加约50%.
这是我的基准测试脚本:
import redis, random, sys
def new_db():
db = redis.Redis(host='localhost', port=6666, db=0)
db.flushall()
return db
def db_info(db):
return " used memory %s " % db.info()["used_memory_human"]
def random_string(_len):
letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
return "".join([letters[random.randint(0,len(letters)-1)] for i in range(_len) ])
def chunk(astr, size):
while len(astr) > size:
yield astr[:size]
astr = astr[size:]
if len(astr):
yield astr
def encode_as_dict(astr, size):
dod={}
cnt = 0
for i in chunk(astr,size):
dod[cnt] = i
cnt+=1
return dod
db=new_db()
r = random_string(1000000)
print "size of string in bytes ", sys.getsizeof(r)
print "default Redis memory consumption", db_info(db)
dict_chunk = 10000
print "*"*100
print "BENCHMARKING \n"
db=new_db()
db.set("akey", r)
print "as string " , db_info(db)
print "*"*100
db=new_db()
db.hmset("akey", encode_as_dict(r,dict_chunk))
print "as dict and stored at value" , db_info(db)
print "*"*100
Run Code Online (Sandbox Code Playgroud)
和我的机器上的结果(32位Redis实例):
size of string in bytes 1000024
default Redis memory consumption used memory 534.52K
******************************************************************************************
BENCHMARKING
as string used memory 2.98M
******************************************************************************************
as dict and stored at value used memory 1.49M
Run Code Online (Sandbox Code Playgroud)
我想通过玩我提到的参数,是否有更有效的方法将字符串存储为哈希.首先,我必须意识到他们的意思..然后我会再次进行基准测试,看看是否有更多的收益..
EDIT2:我是个白痴吗?基准测试是正确的,但确认了一个大字符串.如果我重复许多大字符串,将它们存储为大字符串是明确的赢家..我认为我得到一个字符串的结果的原因在于Redis内部..
实际上,存储大字符串的最有效方法是作为一个大字符串 - 其他任何东西都会增加开销.你提到的优化是为了处理大量的短字符串,字符串之间的空格可能会成为一个问题.
存储大字符串的性能可能不如小字符串好,因为需要找到更多的连续块来存储它,但这实际上不太可能影响任何东西.
| 归档时间: |
|
| 查看次数: |
1819 次 |
| 最近记录: |