[英]Python 3.7.4 -> How to keep memory usage low?
以下代码在给定的数据库上检索、创建和索引 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))
CreditCard
对象,唯一一个在范围内幸存下来的对象,每个对象大约有 64 字节长。
运行后,这段代码应该可以映射大约 1000 万张卡片。 这将转化为 6.4 亿字节,或大约 640 兆字节。
问题是在这个操作中途,内存消耗达到了大约 3GB ......
我的第一个猜测是,出于某种原因,GC 没有收集parsedJson
。 我应该怎么做才能控制内存消耗? 我可以手动处理该对象吗?
编辑1:
信用卡定义为
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 的自定义映射器来解决这个问题:
def object_decoder(obj):
if obj.__contains__('key'):
return CreditCard(obj['key'],xy)
return obj
现在内存增长缓慢,我已经能够使用大约 2GB 的内存解析整个集
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.