पैरेलल एरे का उपयोग कब करना ठीक है?


14

मैं कोड (नया कोड) में चल रहा हूं जो कि मैं 'पैरेलल एरे' या सूचियों का उपयोग करता है। मतलब ऐसे 2 सरणियाँ हैं जिनमें संबंधित डेटा होते हैं और सरणी में उनकी स्थिति (सूचकांक) से जुड़े होते हैं।

मैं इसे भ्रामक मानता हूं और सभी प्रकार की त्रुटियों से ग्रस्त हूं। मैं आमतौर पर प्रस्ताव करता हूं कि समाधान Companyकंपनीआईड और कंपनीनाम के साथ एक ऑब्जेक्ट बनाने के लिए है ।

एक बहुत ही वास्तविक उदाहरण:

List<string> companyNames;
List<int> companyIds;

//...They get populated somewhere and we then process

for(var i=0; i<companyNames.Count; i++)
{
    UpdateCompanyName(companyIds[i],companyNames[i]);
}

क्या इन समानांतर सरणियों को बुरा अभ्यास माना जाता है ?


9
सीधे तौर पर इस बात का सबूत है कि कोई ऐसी भाषा का आविष्कार नहीं किया गया है जिसमें आप फोरट्रान नहीं लिख सकते।
एंडी आम

3
इस तरह से कुछ करने के लिए (काफी महत्वपूर्ण) कैशिंग लाभ हो सकते हैं (हालांकि आपको सन्निहित सरणियों की ज़रूरत नहीं है कि लिस्टेड नहीं हैं), और यह "डेटा-ओरिएंटेड डिज़ाइन" से संबंधित गेम प्रोग्रामिंग में कुछ लोकप्रिय हो गया है। हालाँकि, यह आपके मामले पर लागू नहीं होता है। ऐसा नहीं लगता कि आप प्रदर्शन को महत्वपूर्ण कोड बना रहे हैं।
डेरेक एल्किंस ने SE

2
@DerekElkins ... दिलचस्प है कि आपकी टिप्पणी इस तुलना को फोरट्रान कोड से करती है। फोरट्रान के शुरुआती संस्करणों में उपयोगकर्ता परिभाषित संरचनाओं के लिए समर्थन का अभाव था, और इसके बाद भी इसे जोड़ा गया था मुहावरेदार फोरट्रान कोड संरचनाओं के सरणियों के कई सरणियों का उपयोग करता है। और इसे अक्सर इस कारण के रूप में श्रेय दिया जाता है कि फोरट्रान को अक्सर सबसे तेज़ भाषा माना जाता है।
जूल्स

3
इस प्रश्न के लिए एक विचारशील स्पर्शरेखा: कई कार्यात्मक भाषाएँ सक्रिय रूप से ऐसी सूचियों के साथ काम करने के लिए प्रोत्साहित करती हैं। उनके पास एक फ़ंक्शन है, जिसे आमतौर पर जिप कहा जाता है, जो उन्हें ट्यूपल्स की सूची में बदल देता है। आपका कोड C # जैसा दिखता है। सी # के नवीनतम संस्करण में प्रथम श्रेणी के टुपल्स के लिए समर्थन जोड़ा गया है। मुझे आश्चर्य है कि, इसलिए, उन्होंने कहीं एक ज़िप समारोह जोड़ा है जो आपकी सूचियों को आपके लिए एक उपयोगी संरचना में डाल सकता है?
जूल्स

4
खैर, कभी-कभी जानबूझकर दो सरणियों का उपयोग करने के कारण होते हैं, लेकिन 99% सभी मामलों में मैंने इसे देखा है, इसका एकमात्र कारण मूल लेखक की आलसीता को गले लगाने वाली डेटा संरचना को पेश करना था।
डॉक ब्राउन

जवाबों:


23

यहां कुछ कारण बताए गए हैं कि कोई व्यक्ति पैरलल ऐरे का उपयोग क्यों कर सकता है:

  1. ऐसी भाषा में जो वर्गों या संरचनाओं का समर्थन नहीं करती है
  2. थ्रेड लॉकिंग से बचने के लिए जब व्यक्तिगत थ्रेड्स केवल एक कॉलम को संशोधित कर रहे हैं
  3. जब दृढ़ता विधि इन चीजों को अलग-अलग संग्रहीत करने के लिए मजबूर करती है और आप उन्हें पुनर्गठित कर रहे हैं।
  4. यदि संरचनाएं गद्देदार हैं तो वे कम मेमोरी का उपभोग कर सकते हैं। (इन डेटा प्रकारों के लिए C # में लागू नहीं)
  5. जब CPU कैश का कुशल उपयोग करने के लिए डेटा के कुछ हिस्सों को एक साथ रखा जाना चाहिए (उपरोक्त कोड में मदद नहीं करेगा)।
  6. एकल निर्देश एकाधिक डेटा (SIMD) सेशन कोड का उपयोग। (इस कोड के लिए लागू नहीं है, या तार बिल्कुल)

मुझे इस मामले में ऐसा करने के लिए कोई सम्मोहक कारण नहीं दिख रहा है ... और उपरोक्त सभी में बेहतर विकल्प होने की संभावना है या उच्च स्तरीय भाषा में इतने उपयोगी नहीं हैं।


3
वे कम मेमोरी का उपभोग कर सकते हैं यदि संरचनाएं गद्देदार हैं। कई बड़े सरणियों, बुद्धिमानी से आवंटित, संरचनाओं की एक सरणी की तुलना में कम मेमोरी का उपभोग कर सकते हैं।
फ्रैंक हिलमैन

4
4. जब सीपीयू कैश का कुशल उपयोग करने के लिए डेटा के कुछ हिस्सों को एक साथ रखा जाना चाहिए। (दुर्लभ मामलों में आवश्यक।)
ब्लरफुल

@ फ्रेंक हिलमैन, व्हिली मुझे लगता है कि TheCatWhisperer का जवाब पूरी तरह से सही है, आपकी टिप्पणी, वास्तव में, इस दृष्टिकोण को चुनने का सबसे अच्छा कारण है। यदि मेमोरी खपत महत्वपूर्ण है, तो स्ट्रक्चर्स पैडिंग पर मेमोरी ओवरहेड महत्वपूर्ण हो सकता है, खासकर अगर बड़ी संख्या में प्ले।
व्लादिमीर स्टोकिक

अपने सुझावों को उत्तर में जोड़ा
TheCatWhisperer

Re (2), वह कैसे है? मैं एकल सरणी के साथ एक प्रोग्राम लिख सकता हूं और प्रति फ़ील्ड एक लॉक आसानी से आसानी से लिख सकता हूं जैसे कि मैं कई सरणियों और एक सरणी प्रति लॉक के साथ लिख सकता हूं।
सोलोमन स्लो

7

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

उस बिंदु पर हालांकि यह विवरण को दूर करने के लिए विचार करने योग्य है। अक्सर सबसे बड़ा कारण यह है कि मैं इसे करने के लिए अनिच्छुक हूँ कि यह एक अच्छा नाम के बारे में सोचना मुश्किल है।

यदि आप समानांतर सरणियों को अमूर्त करने का अच्छा तरीका देख सकते हैं तो इसे हर बार करें। लेकिन उन्हें छूने से इनकार करके खुद को लकवाग्रस्त न करें। कभी-कभी थोड़ा गंदा कोड महान कोड के लिए सबसे अच्छा कदम पत्थर है।


6

इस पैटर्न को कभी-कभी संरचना की संरचना भी कहा जाता है (जैसा कि संरचनाओं के सरणी के विपरीत), और कोड वेक्टर करते समय अत्यंत उपयोगी होता है। एक एकल संरचना पर चलने वाली गणना लिखने और इसके बिट्स को वेक्टर करने के बजाय, आप एसएसई इंट्रिंसिक्स को छोड़कर गणना को सामान्य रूप से लिखते हैं, ताकि यह एक के बजाय 4 संरचनाओं पर चलता हो। यह आमतौर पर आसान है, और लगभग हमेशा तेज होता है। एसओए प्रारूप इसे बहुत स्वाभाविक बनाता है। यह संरेखण में भी सुधार करता है, जिससे एसएसई मेमोरी ऑपरेशन तेज हो जाता है।


हां, जीपीयू पर मशीन लर्निंग करते समय इस दृष्टिकोण का उपयोग किया जाता है। यह कई अलग-अलग उदाहरणों के क्षेत्रों को अलग करने के लिए प्रथागत है, प्रत्येक क्षेत्र के सभी मूल्यों को एक अलग टेंसर में पैक करें, और भविष्यवाणियों की सूची का उत्पादन करने के लिए उन टेंसरों को थोक में गणना करने के लिए पास करें।
मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.