সমান্তরাল অ্যারে কখন ব্যবহার করা ঠিক হবে?


14

আমি এমন কোডে (নতুন কোড) চালিয়ে যাচ্ছি যা আমি 'সমান্তরাল অ্যারে' বা তালিকাকে বলে। অর্থ এখানে 2 টি অ্যারে রয়েছে যা সম্পর্কিত ডেটা ধারণ করে এবং অ্যারেতে তাদের অবস্থান (সূচক) দ্বারা সংযুক্ত থাকে।

আমি এটিকে বিভ্রান্তিকর বলে বিবেচনা করি এবং সব ধরণের ত্রুটির প্রবণতা। আমি সাধারণত যে সমাধানটি প্রস্তাব করি তা হ'ল CompanyCompanyId এবং CompanyName ক্ষেত্রগুলির সাথে পরিচিত একটি বস্তু তৈরি করা ।

একটি খুব বাস্তব উদাহরণ:

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
@ ডেরেকএলকিনস ... আকর্ষণীয় যে আপনার মন্তব্যটি ফোর্টরান কোডের সাথে এটির তুলনা করে অনুসরণ করে। ফোর্টরানের প্রাথমিক সংস্করণগুলিতে ব্যবহারকারীর সংজ্ঞায়িত কাঠামোগুলির পক্ষে সমর্থন ছিল না, এবং এটি যুক্ত হওয়ার পরেও ফোরট্রান কোড স্ট্রাকচারের অ্যারে নয় একাধিক বৈশিষ্ট্যযুক্ত অ্যারে ব্যবহার করে। এবং এটি প্রায়শই ফোর্টরানকে দ্রুততম ভাষা হিসাবে বিবেচনা করা হয় বলে একটি অংশ হিসাবে জমা দেওয়া হয়।
জুলে

3
এই প্রশ্নের একটি চিন্তার স্পর্শকাতর: অনেকগুলি কার্যকরী ভাষা সক্রিয়ভাবে এই জাতীয় তালিকা সহ কাজ করার জন্য উত্সাহ দেয়। তাদের একটি ফাংশন থাকে, সাধারণত জিপ নামে পরিচিত যা তাদের টিউপসগুলির তালিকায় রূপান্তর করে। আপনার কোডটি সি # এর মতো দেখাচ্ছে। সি # এর সর্বশেষতম সংস্করণে প্রথম শ্রেণীর টিউপসগুলির জন্য সমর্থন যোগ করা হয়েছে। আমি অবাক হই, সুতরাং, যদি তারা কোথাও একটি জিপ ফাংশন যুক্ত করে থাকে যা আপনার তালিকাগুলি স্বয়ংক্রিয়ভাবে আপনার জন্য একটি কার্যকর কাঠামোতে রাখতে পারে?
জুলে

4
ঠিক আছে, মাঝে মাঝে দুটি অ্যারেটি ইচ্ছাকৃতভাবে ব্যবহার করার কারণ রয়েছে, তবে সব ক্ষেত্রে 99% এর মধ্যে আমি এটি দেখেছি, এটির একমাত্র কারণ মূল লেখকের অলসতা যা একটি আলিঙ্গনকারী ডেটা কাঠামো প্রবর্তন করেছিল।
ডক ব্রাউন

উত্তর:


23

কেউ কেন পার্ল অ্যারে ব্যবহার করতে পারে তার কয়েকটি কারণ এখানে রয়েছে:

  1. এমন ভাষায় যা ক্লাস বা স্ট্রাক্টকে সমর্থন করে না
  2. থ্রেড লকিং এড়ানোর জন্য যখন পৃথক থ্রেড কেবল কলামগুলির মধ্যে একটির সংশোধন করে
  3. যখন অধ্যবসায় পদ্ধতি এই জিনিসগুলিকে পৃথকভাবে সংরক্ষণ করতে বাধ্য করে এবং আপনি সেগুলি পুনর্গঠন করছেন।
  4. স্ট্রাকচারগুলি প্যাড করা থাকলে তারা কম স্মৃতি গ্রহণ করতে পারে। (সি # তে এই ডেটা ধরণের জন্য প্রযোজ্য নয়)
  5. যখন সিপিইউ ক্যাশে দক্ষভাবে ব্যবহার করার জন্য ডেটা অংশগুলি একত্রে রাখা প্রয়োজন (উপরের কোডে সাহায্য করবে না)।
  6. একক নির্দেশ একাধিক ডেটা (সিমডি) ওপ কোড ব্যবহার করুন। (এই কোডের জন্য প্রযোজ্য নয়, বা স্ট্রিং মোটেও নয়)

আমি এক্ষেত্রে এটি করার কোন বাধ্যতামূলক কারণ দেখতে পাচ্ছি না ... এবং উপরের সমস্তটিতে সম্ভবত আরও ভাল বিকল্প রয়েছে বা উচ্চ স্তরের ভাষায় এতটা কার্যকর নয়।


3
স্ট্রাকচারগুলি প্যাড করা থাকলে তারা কম স্মৃতিও গ্রাস করতে পারে। বুদ্ধিমানভাবে বরাদ্দ করা বেশ কয়েকটি বড় অ্যারে কাঠামোগুলির অ্যারের চেয়ে কম মেমরি গ্রাস করতে পারে।
ফ্র্যাঙ্ক হিলিমান

4
৪. সিপিইউ ক্যাশে দক্ষভাবে ব্যবহারের জন্য যখন ডেটার অংশগুলি একসাথে রাখা দরকার। (বিরল ক্ষেত্রে প্রয়োজনীয়।)
ব্লারফ্ল

@ ফ্র্যাঙ্ক হিলেম্যান, হুইলি আমি মনে করি যে থ্যাটিক্সহিস্পেরারের উত্তর সম্পূর্ণরূপে সঠিক, আপনার মন্তব্যটি এই পদ্ধতির চয়ন করার সর্বোত্তম কারণ। মেমরির ব্যবহারটি যদি সমালোচনামূলক হয় তবে স্ট্র্ট প্যাডিংয়ের উপর মেমরির ওভারহেড তাৎপর্যপূর্ণ হতে পারে, বিশেষত যদি বড় সংখ্যক লোক খেলতে থাকে।
ভ্লাদিমির স্টোকিক

উত্তরে আপনার পরামর্শ যুক্ত করেছেন
দ্যাটিক্যাটহিস্পেরার

রে (2), কেমন আছে? একাধিক অ্যারে এবং অ্যারে প্রতি লক সহ একটি লিখতে পারার মতো আমি খুব সহজেই ক্ষেত্র প্রতি একক অ্যারে এবং একটি ক্ষেত্রটিতে একটি লক সহ একটি প্রোগ্রাম লিখতে পারি।
সলোমন স্লো

7

আমি সমান্তরাল অ্যারে ব্যবহারে দোষী হয়েছি । কখনও কখনও আপনি এতটা কাঠামোতে চলে যান আপনি কীভাবে এটি বিমূর্ত করতে পারেন সে সম্পর্কে আপনি ভাবতে চান না। রিম্যাক্টরটি সম্পর্কে বিমূর্ততা কিছুটা কঠিন হতে পারে তাই আপনি যা প্রয়োজন তা প্রমাণ না করা পর্যন্ত আপনি এটিকে শুরু করতে নারাজ।

এই মুহুর্তে যদিও বিশদটি বিমূর্ত করার জন্য রিফ্যাক্টরিং বিবেচনা করা উপযুক্ত। প্রায়শই সবচেয়ে বড় কারণ আমি এটি করতে নারাজ কারণ এটি একটি ভাল নাম সম্পর্কে চিন্তা করা শক্ত হয় যে পরিণত হয়।

আপনি যদি সমান্তরাল অ্যারেগুলি বিমূর্ত করার ভাল উপায় দেখতে পান তবে প্রতিবার এটি করুন। তবে তাদের স্পর্শ করতে অস্বীকার করে নিজেকে পঙ্গু করবেন না। কখনও কখনও কিছুটা নোংরা কোড হ'ল দুর্দান্ত কোডের সেরা ধাপ।


6

এই প্যাটার্নটিকে কখনও কখনও স্ট্রাকচার অফ অ্যারে (স্ট্রাকচারের অ্যারের বিপরীতে )ও বলা হয়, এবং ভেক্টরাইজিং কোড করার সময় এটি অত্যন্ত কার্যকর। কোনও একক স্ট্রাকচারের উপর ভিত্তি করে গণনা লেখার পরিবর্তে এবং এর বিটগুলি ভেক্টরাইজিংয়ের পরিবর্তে, আপনি গণনাটি সাধারণত যেমনটি লিখতেন তেমন এসএসই আন্তঃব্যক্তিকে বাদ দিয়ে যাতে এটি একটির পরিবর্তে 4 কাঠামোর উপর চলে। এটি সাধারণত সহজ এবং প্রায় সবসময় দ্রুত হয়। SoA ফর্ম্যাট এটি খুব স্বাভাবিক করে তোলে। এটি প্রান্তিককরণের উন্নতি করে, যা এসএসই মেমরি অপারেশনগুলিকে দ্রুত করে তোলে।


হ্যাঁ, জিপিইউতে মেশিন লার্নিং করার সময় এই পদ্ধতির ব্যবহার করা হয়। প্রচলিত পৃথক উদাহরণের ক্ষেত্রগুলি পৃথক করে তোলার, প্রতিটি ক্ষেত্রের সমস্ত মান পৃথক টেনসারে প্যাক করে, এবং ভবিষ্যতবাণীগুলির একটি তালিকা তৈরির জন্য এই টেনারগুলিকে বাল্কে গণনা করার জন্য প্রথাগত।
মনিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.