使用python做大数据缓存时遇到的问题

被gc和weakref打败了。 这两天在折腾一个数据缓存的rpc服务,简单说就是个内存缓存,计划不打算用redis,memcached。 因为毕竟这些nosql是跨进程的,链接又是tcp链接,肯定是有损耗的。

但是,我想的太简单了。 再实现的过程中,发现内存总是释放不了,调用gc释放也是相当的有限,这让人十分的抓狂。一开始是以为自己程序的问题,但是随着一遍遍的看代码,发现不对劲,程序里面的那个hash已经基本清零了,但是占用内存还是不少。紧接着我换了套策略,改用lru,lfu的方式,最少使用算法和计数使用算法,看起来很时尚,永远会把旧的数据踢出去,但是…… 踢不干净咋整? lru 还真踢不干净…..

后来搜了下文档,说是用weakref这样的弱引用可以解决。。。 但是,效果也是不明显。 说实话,十分的郁闷呀。

这里针对我的程序,我简单写个demo,体现下我的问题。 有兴趣的朋友也可以看看。

大家会发现,他的内存在gc收回和weakref消除后,还是不能缩减到他一开始的内存使用数。 我这边如果做缓存的话,占用内存大小估计在10G左右,但是如果总是消减不清楚,然后慢慢的,内存中垃圾数据了。

# xiaorui.ccclass TestObj:    def __init__(self):        self.test_attr = 100        self.woyao = {}    def pp(self,go):        print go        print self.woyao    def set(self,key):        self.woyao[key] = '11sdlfjljlskjdf lsdjkflsjdflksdjflsjdf;skf;aksdjflksdjfmnsndfsoduifoiuwflkjsldkjflksjdflksjdflksjdfkasdfjlskdjflskdjfoiuweorisdnflksndflnsldkjlsndflsndcljksdlfjsdlfkjsdlfkjsd;flkjsdflkjsdf;sdfljsdfoiuwlksdjflkj'def test_func(reference):    print 'Hello from Callback function!'a = TestObj()#建立一个对a的代理(弱引用)x = weakref.proxy(a, test_func)for i in xrange(10000000):    x.set(i)del adel xgc.collect()print 'del..'time.sleep(15)

使用python做大数据缓存时遇到的问题

相关文章:

你感兴趣的文章:

标签云: