OGR / GDAL थ्रेडिंग के परिणामस्वरूप कम कोर उपयोग होता है


13

मैं ogr / gdal का उपयोग करके कुछ रेखापुंज डेटा को संसाधित करने का प्रयास कर रहा हूं और मुझे अपनी मशीन पर सभी कोर का पूर्ण उपयोग प्राप्त करने की आवश्यकता नहीं है। जब मैं केवल एक ही कोर पर प्रक्रिया चलाता हूं, तो मुझे उस कोर का 100% उपयोग मिलता है। जब मैं एक्स ऑफ़सेट्स को चुनकर और उन्हें एक कतार में रखकर मल्टीकोर (नीचे के उदाहरण में) में विभाजित करने की कोशिश करता हूं, तो मुझे मेरे प्रत्येक 8 कोर पर दयनीय उपयोग मिलता है। ऐसा लगता है कि यह केवल प्रत्येक कोर में 100% उपयोग को जोड़ता है (उदाहरण के लिए प्रत्येक पर 12.5%)।

मैं चिंतित था कि एक ही डेटा स्रोत का उपयोग अड़चन था, लेकिन मैंने तब प्रत्येक कोर के लिए अंतर्निहित रेखापुंज फ़ाइल को डुप्लिकेट किया था ... और कोर उपयोग अभी भी बकवास है। यह मुझे विश्वास दिलाता है कि ओगर या गदल किसी तरह एक अड़चन साझा संसाधन की तरह व्यवहार कर रहे हैं, लेकिन मुझे इसके बारे में कुछ भी ऑनलाइन नहीं मिल रहा है। कोई भी सहायताकाफी प्रशंसनीय होगी!

यह "हेल्पर" फ़ंक्शन है जो प्रत्येक वर्कर थ्रेड के अंदर चलता है:

def find_pixels_intersect_helper(datasource, bounds_wkt, x_min, x_max):
    bounds = ogr.CreateGeometryFromWkt(bounds_wkt)
    rows_to_write = []
    for x_offset in range(x_min, x_max):
        for y_offset in range(datasource.RasterYSize):
            pxl_bounds_wkt = pix_to_wkt(datasource, x_offset, y_offset)
            pxl_bounds = ogr.CreateGeometryFromWkt(pxl_bounds_wkt)
            if pxl_bounds.Intersect(bounds):
                rows_to_write.append(['%s_%s' % (x_offset, y_offset), pxl_bounds.Centroid().ExportToWkt()])

अनकही, लेकिन क्या आपने जांच की कि क्या स्मृति अड़चन है?
lynxlynxlynx

@lynxlynxlynx - हां। स्मृति निश्चित रूप से अड़चन नहीं है। पूरे दिन इस बात को ट्रैक करने की कोशिश की गई ... यह बहुत अजीब है।
अधिकतम

यह हो सकता है कि आप जिस रैस्टर चालक का उपयोग कर रहे हैं, वह केवल एक समय में एक से अधिक थ्रेड से कॉल करने के लिए डिज़ाइन नहीं किया गया है। संदर्भ: mail-archive.com/gdal-dev@lists.osgeo.org/msg07283.html
blah238

जवाबों:


10

ठीक। वह मेरे जीवन का एक दिन था जो मुझे फिर कभी वापस नहीं मिलेगा। समस्या यह है कि समस्या मेरे द्वारा ऊपर पोस्ट किए गए कोड में नहीं थी। वह पूरी तरह से ठीक है। पता चलता है कि यह थ्रेडिंग का मामला था। थ्रेड बनाम मल्टीप्रोसेसिंग।प्रोसेस।

जैसा कि अजगर प्रलेखन में बताया गया है :

मल्टीप्रोसेसिंग पैकेज थ्रेड के बजाय सबप्रोसेस का उपयोग करके ग्लोबल इंटरप्रेटर लॉक को प्रभावी ढंग से साइड-स्टेपिंग करने के लिए स्थानीय और दूरस्थ दोनों संगामिति प्रदान करता है। इसके कारण, मल्टीप्रोसेसिंग मॉड्यूल प्रोग्रामर को दिए गए मशीन पर कई प्रोसेसर का पूरी तरह से लाभ उठाने की अनुमति देता है

इस प्रकार, थ्रेडिंग। थ्रेड IO- सघन संचालन के लिए है, मल्टीप्रोसेसिंग ।rocess CPU सघन संचालन के लिए है। मैंने मल्टीप्रोसेसिंग पर स्विच किया। फ़ॉरेस्ट और सब कुछ बढ़िया काम करता है।

की जाँच करें इस ट्यूटोरियल multiprocessing.Process उपयोग करने के लिए सीखने के लिए


मैं बस यह सुझाव देने जा रहा था कि, मुझे यकीन नहीं था कि कौन सा कार्यान्वयन (वहाँ भी 3 पार्टी कार्यान्वयन हैं ) आप उपयोग कर रहे थे :) मैंने हाल ही में यहां एक साफ-सुथरी इमारत छाया उपकरण को गति देने के लिए उपयोग किया है: पोर्ट "निर्माण भवन छाया" एवेन्यू ArcGIS 10 के कोड
blah238

+1 मैं पोस्ट करने वाला था कि आपके पास GDAL-dev मेलिंग सूची पर एक शब्द होना चाहिए; लेकिन मैं अब खुश हूँ तुम नहीं किया! भविष्य के संदर्भ के लिए इसे दूर कर दिया गया है।
MerseyViking

एफडब्ल्यूआईडब्ल्यू (शायद बहुत ज्यादा नहीं), मैंने पढ़ा कि कहीं लोग ग्लोबल इंटरप्रेटर लॉक (जीआईएल) की समस्या को ठीक करने के लिए फंड इकट्ठा कर रहे हैं। मुझे लगता है कि यह 3.x के लिए होगा।
कैनिसफ्रुस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.