2 सवाल: मेरा कार्यक्रम काम करता है, लेकिन बहुत धीमा है, जैसे ही यह चलता है यह धीमा हो जाता है

पर बनाया गया सवाल Wed, May 8, 2019 12:00 AM

मैं Microsoft शैक्षणिक ज्ञान API से डेटा खींच रहा हूं और फिर मुझे जो जानकारी चाहिए उसे निकालने के लिए शब्दकोशों के रूप में json प्रतिक्रियाओं का उपयोग कर रहा हूं। जैसा कि मैं ऐसा करता हूं मैं जानकारी को एक सुस्पष्ट सरणी में जोड़ता हूं और अंत में मैं इसे निर्यात करने के लिए एक पांडा डेटा फ्रेम में बदल देता हूं। कार्यक्रम ठीक काम करता है, लेकिन इसे चलाने के लिए भारी मात्रा में समय लगता है। यह धीमी गति से चलता है, हालांकि यह छोरों के माध्यम से पहले कुछ समय के रूप में चलता है, यह केवल कुछ सेकंड लेता है, लेकिन इसमें मिनट लगते हैं।

मैंने जितना हो सके बयानों को सरल बनाने की कोशिश की है और इससे थोड़ा बहुत मदद मिली है लेकिन एक बड़ा अंतर बनाने के लिए पर्याप्त नहीं है। मैंने जितनी बार एपीआई की क्वेरी की है उतनी बार कम किया है। प्रत्येक क्वेरी केवल 1000 परिणाम वापस कर सकती है, लेकिन लगभग 35000 परिणाम हैं जिनकी मुझे आवश्यकता है।

rel_info = np.array([("Title", "Author_Name", "Jornal_Published_In", "Date")])

for l in range(0, loops):                        # loops is defined above to be 35
    offset = 1000 * l
    # keep track of progress
    print("Progress:" + str(round((offset/total_res)*100, 2)) + "%")
    # get data with request to MAK. 1000 is the max count
    url = "https://api.labs.cognitive.microsoft.com/academic/v1.0/evaluate?expr=And(Composite(AA.AfN=='brigham young university'),Y>=1908)&model=latest&count=1000&offset="+str(offset)+"&attributes=Ti,D,AA.DAfN,AA.DAuN,J.JN"
    response = req.get(url + '&subscription-key={key}')

    data = response.json()

    for i in range(0, len(data["entities"])):
        new_data = data["entities"][i]
        # get new data
        new_title = new_data["Ti"]                 # get title

        if 'J' not in new_data:                    # get journal account for if keys are not in dictionaries
            new_journ = ""
        else:
            new_journ = new_data["J"]["JN"] or ""

        new_date = new_data["D"]                   # get date

        new_auth = ""                              # get authors only affiliated with BYU account for if keys are not in dictionary
        for j in range(0, len(new_data["AA"])):
            if 'DAfN' not in new_data["AA"][j]:
                new_auth = new_auth + ""
            else:
                if new_data["AA"][j]["DAfN"] == "Brigham Young University" and new_auth == "":     # posibly combine conditionals to make less complex
                    new_auth = new_data["AA"][j]["DAuN"]
                elif new_data["AA"][j]["DAfN"] == "Brigham Young University" and new_auth != "":
                    new_auth = new_auth +", "+ new_data["AA"][j]["DAuN"]
        # keep adding new data to whole dataframe
        new_info = np.array([(new_title, new_auth, new_journ, new_date)])
        rel_info = np.vstack((rel_info, new_info))
    
- 1
  1. कृपया अपने प्रश्न में कुछ न्यूनतम, पूर्ण और सत्यापन योग्य उदाहरण दिखाएं
    2019-05-08 16: 09: 05Z
  2. क्या आपको पता है कि मंदी कहाँ हो रही है? शायद रिमोट एपीआई आपसे नाराज़ हो रहा है और आपके अनुरोधों को दरकिनार कर रहा है?
    2019-05-08 16: 12: 17Z
  3. मैं वापस गया और एक बार देखा कि इसे चलाने के लिए कुछ समय प्रिंट किया और मैंने पाया कि वृद्धि तब से हो रही है जब मैं सुन्न से vstack फ़ंक्शन का उपयोग कर रहा हूं। जैसे-जैसे सरणी बड़ी होती जाती है, उसे स्टैक करने में अधिक समय लगता है। लेकिन मुझे अभी भी नहीं पता है कि मुझे इसके बारे में कैसे पता चलेगा क्योंकि मुझे अभी भी किसी भी नई जानकारी को संलग्न करने की आवश्यकता है जो मैं बड़े अक्षरों में निकालता हूं।
    2019-05-08 16: 54: 23Z
  4. किसी सरणी का उपयोग न करें। इस मामले में कोई मतलब नहीं है, ऐसा लगता है कि आप तार के साथ काम कर रहे हैं? बस के साथ एक सामान्य सूची का उपयोग करें। परिशिष्ट, जो आपको रेखीय समय देगा, लेकिन vstack के साथ एक संख्यात्मक सारणी का उपयोग करके यह एल्गोरिथ्म द्विघात बनाता है
    2019-05-08 17: 05: 14Z
  5. "निर्यात करने के लिए पांडा का उपयोग करने" से आपका क्या मतलब है? आप किसी भी मामले में सूचियों की सूची से एक पांडा डेटाफ्रेम का निर्माण कर सकते हैं, लेकिन क्या आप केवल एक सीएसवी को डंप करने के लिए पांडा का उपयोग कर रहे हैं?
    2019-05-08 17: 06: 40Z
    2 उत्तर                              2                         

    concurrent.futures का उपयोग करके कार्यकर्ता थ्रेड्स के पूल में परिणाम प्राप्त करने का प्रयास करें:

    import concurrent.futures
    import urllib.request
    
    URLS = ['http://www.foxnews.com/',
            'http://www.cnn.com/',
            'http://europe.wsj.com/',
            'http://www.bbc.co.uk/',
            'http://some-made-up-domain.com/']
    
    # Retrieve a single page and report the URL and contents
    def load_url(url, timeout):
        with urllib.request.urlopen(url, timeout=timeout) as conn:
            return conn.read()
    
    # We can use a with statement to ensure threads are cleaned up promptly
    with concurrent.futures.ThreadPoolExecutor() as executor:
        # Start the load operations and mark each future with its URL
        future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
        for future in concurrent.futures.as_completed(future_to_url):
            url = future_to_url[future]
            try:
                data = future.result()
            except Exception as exc:
                print('%r generated an exception: %s' % (url, exc))
            else:
                print('%r page is %d bytes' % (url, len(data)))
    

    https://docs.python.org/3/library/concurrent .futures.html

        
    0
    2019-05-08 16: 20: 47Z

    मैंने इसे बदलकर यह हल किया कि मैं अपने द्वारा एकत्र किए जा रहे डेटा के बड़े सरणी में कैसे जोड़ रहा हूं। प्रत्येक पुनरावृत्ति में डेटा की एक पंक्ति जोड़ने के बजाय मैंने एक अस्थायी सरणी बनाई, जो डेटा की 1000 पंक्तियों को धारण करेगी, फिर मैं इस अस्थायी सरणी को पूर्ण डेटा एक में जोड़ दूंगा। इससे पहले रन लेने के समय को लगभग एक मिनट तक कम कर दिया गया था, जबकि 43 मिनट पहले इसका विरोध किया गया था।

    rel_info = np.array([("Title", "Author_Name", "Jornal_Published_In", "Date")])
    
    for req_num in range(0, loops):
    offset = 1000 * req_num
    # keep track of progress
    print("Progress:" + str(round((offset/total_res)*100, 2)) + "%")
    # get data with request to MAK. 1000 is the max count
    url = "https://api.labs.cognitive.microsoft.com/academic/v1.0/evaluate?expr=And(Composite(AA.AfN=='brigham young university'),Y>=1908)&model=latest&count=1000&offset="+str(offset)+"&attributes=Ti,D,AA.DAfN,AA.DAuN,J.JN"
    response = req.get(url + '&subscription-key={key}')
    
    data = response.json()
    
    for i in range(0, len(data["entities"])):
        new_data = data["entities"][i]
        # get new data
        new_title = new_data["Ti"]                 # get title
    
        if 'J' not in new_data:                    # get journal account for if keys are not in dictionaries
            new_journ = ""
        else:
            new_journ = new_data["J"]["JN"] or ""
    
        new_date = new_data["D"]                   # get date
    
        new_auth = ""                              # get authors only affiliated with BYU account for if keys are not in dictionary
        for j in range(0, len(new_data["AA"])):
            if 'DAfN' not in new_data["AA"][j]:
                new_auth = new_auth + ""
            else:
                if new_data["AA"][j]["DAfN"] == "Brigham Young University" and new_auth == "":     # posibly combine conditionals to make less complex
                    new_auth = new_data["AA"][j]["DAuN"]
                elif new_data["AA"][j]["DAfN"] == "Brigham Young University" and new_auth != "":
                    new_auth = new_auth +", "+ new_data["AA"][j]["DAuN"]
    
        # here are the changes
        # keep adding to a temporary array for 1000 entities
        new_info = np.array([(new_title, new_auth, new_journ, new_date)])
        if (i == 0): work_stack = new_info
        else: work_stack = np.vstack((work_stack, new_info))
    # add temporary array to whole array (this is to speed up the program)
    rel_info = np.vstack((rel_info, work_stack))
    
        
    0
    2019-05-08 17: 43: 15Z
स्रोत रखा गया यहाँ