7

मैं बाहरी एपीआई से डेटा का अनुरोध कर रहा हूं, और इसे सीधे क्लाउड स्टोरेज फ़ाइल पर लिख रहा हूं। डेटा सिर्फ ठीक लिखता है, लेकिन जब मैं स्केल करता हूं, तो मैं स्मृति समस्याओं में भाग ले रहा हूं और जीएई उदाहरणों पर 1024 एमबी सीमा को मार रहा हूं।क्लाउड स्टोरेज को लिखते समय जीएई मेमोरी लीक, क्या मैं इसके बजाय स्ट्रीम कर सकता हूं?

ये गंभीर त्रुटियों मैं कर रहे हैं:

Exceeded soft private memory limit of 1024 MB with 1425 MB after servicing 46 requests total 

इस कोड मैं उपयोग कर रहा हूँ का सार है:

import cloudstorage as gcs 
import urllib2 

# Example file path 
filePath = '/bucket/dir/file.gzip' 

def deferrableTask(filePath, api_url, post_body): 
    with gcs.open(filePath, 'w') as f: 
     request = urllib2.Request(api_url, post_body) 
     try: 
     response = urllib2.urlopen(request, timeout = 600) 
     except urllib2.HTTPError, e: 
     raise customError(e) 
     else: 
     while True: 
      chunk = response.read(16 * 1024) 
      if not chunk: break 
      f.write(chunk) 
     f.close() 
     del f 
    gc.collect() 

कार्य से ऊपर deferrable कार्यपंक्तियों उपयोग करने के लिए किया जाता है। उनमें से 40 तक एक कतार में एक साथ चल सकते हैं।

instance_class: F4_1G 
automatic_scaling: 
    max_concurrent_requests: 4 

इस कोड को बादल भंडारण करने के लिए एपीआई डेटा लिखने के लिए काम करता है: मेरी app.yaml में, मैं निम्नलिखित सेटिंग है। यह तब होता है जब मैं इन अनुरोधों में से कई सौ करना शुरू करता हूं कि मैं स्मृति समस्याओं में भागना शुरू करता हूं।

जीजीआईपी फाइलों ने 300 केबी से 10-20 एमबी के आकार में रेंज का अनुरोध किया, और मैंने सोचा कि gc.collect() का उपयोग करके, समवर्ती उदाहरण अनुरोधों की संख्या सीमित करने के संयोजन में, मेमोरी लीक पर वापस कटौती करने के लिए पर्याप्त होगा। मुझे यह भी पता है कि urllib2 ऐप इंजन के urlfetch के लिए केवल एक रैपर है, लेकिन fetching समस्या नहीं है, यह स्केलिंग है।

कितना स्मृति चर f तक का समय लग जाता है? क्या डेटा को पहले उदाहरण स्मृति में लोड करने के बजाय, सीधे Google क्लाउड स्टोरेज पर स्ट्रीम करना संभव है?

+0

मैं एक ही समस्या हो रही है। हमारा वेब-ऐप जीसीएस को एक फाइल लिखने की कोशिश कर रहा है जो केवल 20 एमबी है और अनुरोध त्रुटि के साथ अक्सर असफल रहता है: 'कुल मिलाकर 0 अनुरोधों को सर्विस करने के बाद 216 एमबी के साथ 128 एमबी की सॉफ्ट निजी मेमोरी सीमा पार हो गई। –

+0

मैं किसी भी प्रकार की स्केलिंग का उपयोग नहीं कर रहा हूं। मैं एफ 4_1 जी मशीनों का भी उपयोग नहीं कर रहा हूं, मैं डिफ़ॉल्ट एफ 1 का उपयोग कर रहा हूं। मुझे नहीं लगता कि इस समस्या का उदाहरण कक्षाओं या स्केलिंग सेटिंग्स के साथ कुछ भी करना है। मुझे केवल 1 अनुरोध का प्रयास करने के बाद, एक ही F1 इंस्टेंस पर मेमोरी त्रुटियां मिल रही हैं। 'क्लाउडस्टोरेज' lib के साथ कुछ गलत होना चाहिए? –

+0

मुझे लगता है कि यह मामला है। मजबूर कचरा संग्रह के साथ भी उदाहरण स्मृति के लिए बहुत अधिक कार्य को बरकरार रखते हैं, जिससे मुझे विश्वास होता है कि ऐप इंजन के साथ कुछ गड़बड़ है। चारों ओर एकमात्र काम असफल कार्यों को बाद में पुनः प्रयास करने के लिए दोहराना कतार में भेजना था, लेकिन तब भी कुछ बड़े कार्य कभी खत्म नहीं होंगे। – Jabberwockey

उत्तर

0

एक तरीका है, कि आप सीधे बाहरी ऐप से जीसीएस को डेटा लिख ​​सकते हैं, इसके लिए आपको बाल्टी के एसीएल को सार्वजनिक रूप से बदलना होगा और फिर क्लाउड स्टोरेज एपीआई की मदद से डेटा लिखना होगा बाल्टी।

इसके अलावा, मुझे पता है आप अपने प्रश्न में स्वचालित स्केलिंग विन्यास की किसी भी जानकारी को याद किया करते हैं। यदि हां तो कृपया उन विवरणों को निर्दिष्ट करें।

+0

डेटा गोपनीय और स्वामित्व है, जिसका अर्थ है कि बाल्टी को कभी भी सार्वजनिक नहीं किया जा सकता है। – Jabberwockey

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