gpt4 book ai didi

Python 字典吃掉了 ram

转载 作者:行者123 更新时间:2023-12-04 19:12:16 26 4
gpt4 key购买 nike

我对编程非常陌生,并制作了一个程序来从 Team Fortress 2 玩家那里获取库存数据,并将库存元素放入以 steamid 为键、以元素列表为值的字典中。

我遇到的问题是,在字典中输入了大约 6000 个条目后,该程序基本上占用了我系统上的所有 RAM 并关闭。

我猜字典只是变得太大了,但是根据我从类似问题中读到的内容,6000 个条目的字典不应该占用我那么多的 RAM。

我一直在研究其他解决方案,但我可以为我的代码使用一些具体示例。

import re, urllib.request, urllib.error, gzip, io, json, socket, sys

with open("index_to_name.json", "r", encoding=("utf-8")) as fp:
index_to_name=json.load(fp)

with open("index_to_quality.json", "r", encoding=("utf-8")) as fp:
index_to_quality=json.load(fp)

with open("index_to_name_no_the.json", "r", encoding=("utf-8")) as fp:
index_to_name_no_the=json.load(fp)

with open("steamprofiler.json", "r", encoding=("utf-8")) as fp:
steamprofiler=json.load(fp)

inventory=dict()
playerinventories=dict()
c=0

for steamid in steamprofiler:
emptyitems=[]
items=emptyitems
try:
url=urllib.request.urlopen("http://api.steampowered.com/IEconItems_440/GetPlayerItems/v0001/?key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&steamid="+steamid+"&format=json")
inv=json.loads(url.read().decode("utf-8"))
url.close()
except (urllib.error.HTTPError, urllib.error.URLError, socket.error) as e:
c+=1
print("URL/HTTP error, continuing")
continue
try:
for r in inv["result"]["items"]:
inventory[r["id"]]=r["quality"], r["defindex"]
except KeyError:
c+=1
print(steamid, "didn't have an inventory")
continue
for key in inventory:
try:
if index_to_quality[str(inventory[key][0])]=="":
items.append(
index_to_quality[str(inventory[key][0])]
+""+
index_to_name[str(inventory[key][1])]
)
else:
items.append(
index_to_quality[str(inventory[key][0])]
+" "+
index_to_name_no_the[str(inventory[key][1])]
)
except KeyError:
print("Key error, uppdate def_to_index")
c+=1
continue
playerinventories[int(steamid)]=items
items=emptyitems
c+=1
print(c, "inventories fetched")

我真的不知道在保留字典外观的同时还有其他任何方法可以做到这一点,这非常重要,因为我希望能够分辨出它是谁的库存。如果我对此有任何不清楚,请直说,我会尽力解释

最佳答案

我认为您的代码中有一些逻辑错误。例如,您将每个玩家的库存元素添加到 inventory字典,然后迭代它以填充其他内容。

但是,您永远不会重置 inventory字典,所以它会继续积累元素(所以第二个玩家除了他们自己的元素外,似乎还有第一个人的元素栏)。

您在 items 上遇到了类似的问题。你稍后会用到的字典。您将其重置为 emptyitems它最初是一个空列表,但由于 Python 中的赋值是通过引用进行的,因此这不起作用( items 已经与 emptyitems 是同一对象)。

通过这两个修复程序,您可能有更好的机会不使用所有系统内存。

另一个杂项代码改进(可能与内存使用无关):

在你的循环中 inventory ,您重复访问相同的两个值而不使用 key为了任何东西。而不是 for key in inventory试试 for value1, value2 in inventory.itervalues() (或 in inventory.values(),如果您使用的是 Python 3)。然后使用 value1代替 inventory[key][0]value2代替 inventory[key][1] (或者甚至更好,给它们起更有意义的名字)。

编辑 :这是循环的样子(我在猜测之前在 inventory[key][0]inventory[key][1] 中的两个值的名称):

for quality, name in inventory.itervalues():
try:
if index_to_quality[str(quality)]=="":
items.append(
index_to_quality[str(quality)]
+""+
index_to_name[str(name)]
)
else:
items.append(
index_to_quality[str(quality)]
+" "+
index_to_name_no_the[str(name)]
)

关于Python 字典吃掉了 ram,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13761244/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com