Ich bin ziemlich neu zu programmieren und machte ein Programm, um Inventardaten von Team Fortress 2 Spielern zu holen und die Inventargegenstände in ein Wörterbuch mit dem steamid als der Schlüssel und der Liste der Einzelteile als der Wert zu setzen .Python-Wörterbuch Essen ram
Das Problem, auf das ich gestoßen bin, ist, dass nach ungefähr 6000 Einträgen in das Wörterbuch das Programm im Wesentlichen den gesamten RAM auf meinem System aufgesaugt hat und heruntergefahren wird.
Ich nehme an, das Wörterbuch wird einfach zu groß, aber nach dem, was ich von ähnlichen Fragen gelesen habe, sollte ein Diktat von 6000 Einträgen nicht so viel von meinem RAM aufnehmen.
Ich habe nach anderen Lösungen gesucht, aber ich könnte einige konkrete Beispiele für meinen Code verwenden.
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")
Ich weiß nicht wirklich irgendeinen anderen Weg, es zu tun, während das Wörterbuch appearence beibehalten, was ganz wichtig ist, wie ich möchte in der Lage sein, dessen Inventars zu sagen, es ist. Wenn ich in irgendetwas davon unklar waren, sagen Sie einfach so, und ich werde versuchen,
Also: inventory = dict() items = list() an den start der "für steamid in steamprofiler" schleife sollte die memory hogging zu verhindern einem gewissen Grad? Ich verstehe das Problem mit der Inventarisierungsschleife nicht ganz, die Schlüsselwerte im Inventar entsprechen den Namen in index_to_name und index_to_quality. Wie verbessert Ihre Lösung das? Ich gebe hier keinen Mund, ich bin wirklich neugierig, da ich ziemlich neu bin. – Tenbin
In Bezug auf die Schleife über 'Inventar', ich war nur ein bisschen seltsam, dass Sie auf 'Inventar [Schlüssel] [0]' und 'Inventar [Schlüssel] [0] 'zugreifen und nirgendwo anders' Schlüssel' zugreifen. Wenn dies die Werte sind, die Sie verwenden müssen (um sie in Ihre anderen Wörterbücher zu indizieren), schlage ich vor, dass Sie die Schleife direkt auf ihnen durchlaufen lassen. Wenn 'inventory [key] 'ein Tupel oder eine Liste mit zwei Elementen ist, können Sie es in zwei Variablen direkt in der' for'-Anweisung entpacken. Ich werde meine Antwort bearbeiten, um zu zeigen, wie das aussehen würde, mit richtiger Einrückung. – Blckknght