我對編程相當陌生,並且製作了一個程序從Team Fortress 2玩家獲取庫存數據,並將庫存物品放入字典中,其中steamid作爲關鍵字,項目列表作爲值。Python字典吃掉內存
我遇到的問題是,大約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")
我真的不知道任何其他方式做到這一點,同時保留字典appearence,這是因爲我希望能告訴他們的庫存還是比較重要的。如果我在任何的這個不清楚,只是這麼說,我會盡力解釋
因此,加入:「0121」一定程度上?我不太瞭解庫存循環的問題,庫存中的關鍵值與index_to_name和index_to_quality中的名稱相對應,您的解決方案如何做得更好?我不會在這裏說話,我真的很好奇,因爲我很新。 – Tenbin
關於庫存循環,我只是在訪問'inventory [key] [0]'和'inventory [key] [0]'而不訪問其他地方的'key'時有點奇怪。如果這些是你需要使用的值(用於索引你的其他字典),我建議你直接循環迭代它們。如果'inventory [key]'是一個兩元組元組或列表,可以在'for'語句中將其解壓縮爲兩個變量。我會編輯我的答案,以顯示如何看起來,適當的縮進。 – Blckknght