Python 3.7.4->;如何保持低内存使用率?

Python 3.7.4->;如何保持低内存使用率?,python,python-3.x,garbage-collection,Python,Python 3.x,Garbage Collection,下面的代码检索并创建给定数据库上uniqueCards的索引 for x in range(2010,2015): for y in range(1,13): index = str(x)+"-"+str("0"+str(y) if y<10 else y) url = urlBase.replace("INDEX",index) response = requests.post(url,data=query,auth=(user,

下面的代码检索并创建给定数据库上uniqueCards的索引

for x in range(2010,2015):
    for y in range(1,13):
        index = str(x)+"-"+str("0"+str(y) if y<10 else y)
        url = urlBase.replace("INDEX",index)
        response  = requests.post(url,data=query,auth=(user,pwd))

        if response.status_code != 200:
            continue

        #this is a big json, around 4MB each
        parsedJson = json.loads(response.content)["aggregations"]["uniqCards"]["buckets"]

        for z in parsedJson:
            valKey = 0
            ind = 0
            header = str(z["key"])[:8]

            if header in headers:
                ind = headers.index(header)
            else:
                headers.append(header)

            valKey = int(str(ind)+str(z["key"])[8:])

            creditCards.append(CreditCard(valKey,x*100+y))
编辑2:

当我在
信用卡上获得350万张卡时,
sys.getsizeof(creditCards)
报告31MB,但这个过程消耗了2GB

问题在于
json.load
。加载4MB会导致5-8x内存跳转

编辑:

我使用JSON的自定义映射器解决了这个问题:

def object_decoder(obj):
    if obj.__contains__('key'):
        return CreditCard(obj['key'],xy)
    return obj

现在,内存增长缓慢,我已经能够使用大约2GB的内存解析整个集合了

很可能每个
信用卡
对象的成本都超过了64字节。到底是什么让你认为它们大约是64字节?“中途”有多远?信用卡的代码是什么?您使用的是32位还是64位Python?信用卡对象由2,8位整数组成,所以我认为64字节的度量是正确的。。。中途岛大约在2013年(外环)。。。从没有到2014年。。。我正在使用64位Python,我刚刚尝试了
(12345678)。\uuu sizeof\uuuu()
在64位Python上,结果显示是28字节。所以这两个整数已经是56字节了。对这些数字的引用,
信用卡
对象本身,以及对信用卡的引用都需要额外的费用。不可能所有这些都能放入8个字节。
sys.getsizeof(CreditCard(valKey,x*100+y))
表示64,但好的,让我们考虑一下这是128。3gb仍然是预期的1.2gb的两倍多…信用卡是否保留了任何其他参考资料?您添加到问题中的代码显然不是全部代码,因为没有构造函数。这不会在内存中停留太久。一旦在下一次循环迭代中重新分配变量,就不再需要旧数据,其空间可以重用。尝试将
continue
放在
parsedJson=json.loads(…)
之后,这样您只需加载,不保留任何内容。你的内存使用率有多高?基本上是一样的。。。我甚至测试了加载一个Json,添加一个循环来模拟一些工作,并给垃圾收集器一些时间来执行操作,但它没有停止
def object_decoder(obj):
    if obj.__contains__('key'):
        return CreditCard(obj['key'],xy)
    return obj