- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对编程非常陌生,并制作了一个程序来从 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/
长期以来,我一直在寻找解决我的问题的方法,这就是我求助于您的原因: 考虑这段代码: static char done = 0; static void sigHandler(void) { d
我现在的职业是信息架构师和 JavaScript 开发人员,但最近我又回到了后端编码领域。而且,在尝试集成 HTML 原型(prototype)并与我们基于 C# 的 CMS 一起工作时,我与我们的程
我为 Jersey 创建了一个 LoggingFilter,并在 web.xml 中正确配置了它。一切正常。当我执行“GET”时,我得到 userPrincipal (request.getUserP
我没问题 Xcode 8.3.2 和 SourceKitService 正在使用我所有的 CPU。我在stackoverflow上阅读了很多问题,但找不到真正的解决方案。 我试过的: 清理项目数据:c
我是一名优秀的程序员,十分优秀!