Python 3.7.4->;如何保持低内存使用率?
下面的代码检索并创建给定数据库上uniqueCards的索引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,
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