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

 

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

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

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

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

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

# xiaorui.cc
class 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;aksdjflksdjfmnsndf
soduifoiuwflkjsldkjflksjdflksjdflksjdfkasdfjlskdjflskdjfoiuweorisdnflksndflnsldkjlsndfls
ndcljksdlfjsdlfkjsdlfkjsd;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 a
del x
gc.collect()
print 'del..'
time.sleep(15)





大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

3 Responses

  1. orangleliu 2014年10月31日 / 下午5:30

    后来怎么解决的? 专家

    • 峰云 2014年11月1日 / 上午7:09

      后来确定别的逻辑都回收,就mysql 在多线程复用得时候没回收,换了pymysql

  2. orangleliu 2014年10月31日 / 下午5:28

    lru,lfu 这个是啥,看不懂

发表评论

邮箱地址不会被公开。 必填项已用*标注