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

Python 3.7.4 -> How to keep memory usage low?

以下代码在给定数据库上检索、创建和索引 uniqueCards。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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))

CreditCard 对象,唯一存在于范围内的对象,每个对象大约有 64 字节长。
运行后,这段代码应该映射大约 1000 万张卡片。这将转换为 6.4 亿字节,或大约 640 兆字节。

问题是在这个操作中途,内存消耗达到了大约 3GB...

我的第一个猜测是,出于某种原因,GC 没有收集 parsedJson。我应该怎么做才能控制内存消耗?我可以手动处理该对象吗?

编辑1:
CreditCard 定义为

1
2
3
4
5
6
class CreditCard:
    number = 0
    knownSince = 0
    def __init__(self, num, date):
        self.number=num
        self.knownSince=date

编辑2:
当我在 creditCards.__len__() 上达到 350 万张卡时,sys.getsizeof(creditCards) 报告 31MB,但进程消耗 2GB!


问题是json.load。加载 4MB 会导致 5-8 倍的内存跳跃。

编辑:

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

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

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