2012-12-07 18 views
5

मैं प्रोग्रामिंग के लिए काफी नया हूं और टीम किले 2 खिलाड़ियों से सूची डेटा लाने के लिए एक कार्यक्रम बनाया है और सूची आइटम को कुंजी के रूप में स्टीमिड के साथ एक शब्दकोश में डाल दिया है ।पाइथन शब्दकोश रैम खाने

जिस समस्या में मैं दौड़ रहा हूं वह यह है कि शब्दकोश में लगभग 6000 प्रविष्टियों के बाद कार्यक्रम ने मेरे सिस्टम पर सभी रैम को अनिवार्य रूप से चूसा और बंद कर दिया है।

मुझे लगता है कि शब्दकोश का अनुमान लगाना बहुत बड़ा हो गया है, लेकिन मैंने इसी तरह के प्रश्नों से जो पढ़ा है, उससे 6000 प्रविष्टियों के एक नियम को मेरी अधिकांश रैम नहीं लेनी चाहिए।

मैं अन्य समाधानों में देख रहा हूं लेकिन मैं अपने कोड के लिए कुछ ठोस उदाहरणों का उपयोग कर सकता हूं।

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") 

मैं वास्तव में, जबकि उपस्थिति, शब्दकोश जो काफी महत्वपूर्ण है क्योंकि मैं जिसका सूची यह है बताने के लिए सक्षम होने के लिए चाहते हैं बनाए रखने के यह करने के लिए किसी भी अन्य तरीके का पता नहीं है। मैं इस में से किसी में स्पष्ट नहीं किया गया है, तो बस इतना कहते हैं कि और मेरा मानना ​​है कि यह अपने कोड के साथ एक समस्या को दिखाता है मैं

उत्तर

4

मुझे लगता है कि आपके कोड में कुछ तर्क त्रुटियां हैं। उदाहरण के लिए, आप प्रत्येक प्लेयर की सूची आइटम inventory शब्दकोश में जोड़ रहे हैं, फिर अन्य सामान भरने के लिए इसे फिर से चालू कर रहे हैं।

हालांकि, आप कभी भी inventory शब्दकोश को रीसेट नहीं कर रहे हैं, इसलिए यह आइटम जमा करना जारी रखता है (इसलिए दूसरे खिलाड़ी के पास स्वयं के अलावा पहले व्यक्ति की सूची दिखाई देगी)।

आपको items शब्दकोश के साथ एक ही समस्या मिली है जिसका आप बाद में उपयोग कर रहे हैं। आप इसे emptyitems पर रीसेट कर देते हैं जो मूल रूप से एक खाली सूची थी, लेकिन क्योंकि पाइथन में असाइनमेंट संदर्भ से है, इसका कोई प्रभाव नहीं है (items पहले से ही emptyitems जैसा ही ऑब्जेक्ट था)।

उन दो सुधारों के साथ आपको अपने सिस्टम की सभी मेमोरी का उपयोग न करने का बेहतर मौका मिल सकता है।

एक और विविध कोड सुधार (शायद स्मृति के उपयोग से संबंधित नहीं):

inventory से अधिक

अपने पाश में, आप बार-बार एक ही दो मानों तक पहुँच रहे हैं और कुछ भी key का उपयोग नहीं। for key in inventory के बजाय for value1, value2 in inventory.itervalues() (या in inventory.values() का प्रयास करें यदि आप पायथन 3 का उपयोग कर रहे हैं)। फिर और value2 के स्थान पर value1inventory[key][1] (या इससे भी बेहतर, उन्हें अधिक सार्थक नाम दें) के स्थान पर value1 का उपयोग करें।

संपादित:

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)] 
       ) 
+0

तो जोड़ना: सूची = dict() आइटम = सूची() "steamprofiler में भाप के लिए" लूप को स्मृति को हॉगिंग को रोकना चाहिए कुछ मात्रा में या कुछ हद तक? मैं इन्वेंट्री लूप के साथ समस्या को समझ नहीं पा रहा हूं, इन्वेंट्री में प्रमुख मान index_to_name और index_to_quality में नामों के अनुरूप हैं, आपका समाधान बेहतर कैसे करता है? मैं यहाँ मुंह नहीं दे रहा हूं, मैं वास्तव में उत्सुक हूं क्योंकि मैं काफी नया हूं। – Tenbin

+0

'सूची' पर लूप के बारे में, मैं बस थोड़ा अजीब था कि आप 'सूची [कुंजी] [0]' और 'सूची [कुंजी] [0] 'तक पहुंच रहे थे और कहीं और' कुंजी 'तक नहीं पहुंच रहे थे। यदि वे मान हैं जिन्हें आपको उपयोग करने की आवश्यकता है (अपने अन्य शब्दकोशों में अनुक्रमणित करने के लिए), तो मेरा सुझाव है कि आप लूप को सीधे उन पर बना दें। यदि 'सूची [कुंजी]' दो तत्व टुपल या सूची है, तो आप इसे 'for' कथन में दो चरों में अनपैक कर सकते हैं। मैं यह दिखाने के लिए अपना जवाब संपादित करूंगा कि उचित इंडेंटेशन के साथ यह कैसा दिखाई देगा। – Blckknght

1

समझाने की कोशिश करेंगे:

>>> emptyitems=[] 
>>> a=emptyitems 
>>> a.append("hello") 
>>> a.append("bar") 
>>> a 
['hello', 'bar'] 
>>> emptyitems 
['hello', 'bar'] 

दूसरे शब्दों में, आप पर कब्जा कर रहे हैं emptyitems सूची का संदर्भ, जो वास्तव में बहुत बड़ा बढ़ रहा है। शायद यह आपके लिए क्या मतलब नहीं है, और मैं कल्पना कर सकता हूं कि यह बहुत बड़ी सूची को जोड़ने के लिए काफी मेमोरी-गहन बन रहा है।

+0

लगता है कि मैं तय है कि आइटम जोड़कर =: यहाँ लूप (मैं इन सबसे छुटकारा inventory[key][1] दो मानों कि inventory[key][0] में पहले से थे और के लिए नामों पर अनुमान लगा रहा हूँ) कैसे दिखाई दे सकती है steamprofiler लूप में भाप के लिए शुरुआत की सूची() – Tenbin

संबंधित मुद्दे