gpt4 book ai didi

python - Redis内存优化

转载 作者:IT王子 更新时间:2023-10-29 05:56:20 28 4
gpt4 key购买 nike

我正在尝试在 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

以及我机器上的结果(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

我想问是否有一种更有效的方法来将字符串存储为散列,即使用我提到的参数。所以首先,我必须知道它们的意思。然后我会再次进行基准测试,看看是否有更多收获。

EDIT2:我是白痴吗?基准测试是正确的,但已针对一个大字符串进行了确认。如果我对许多大字符串重复,将它们存储为大字符串是绝对的赢家。我认为我得到一个字符串的这些结果的原因在于 Redis 内部结构。

最佳答案

实际上,存储大字符串最有效的方法是存储大字符串——任何其他方式都会增加开销。您提到的优化用于处理大量短字符串,其中字符串之间的空格可能会成为问题。

存储大字符串的性能可能不如小字符串,因为需要找到更多连续的 block 来存储它,但这不太可能实际影响任何东西。

关于python - Redis内存优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7464867/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com