হাই / লো অ্যালগরিদম কী?


464

হাই / লো অ্যালগরিদম কী?

আমি এটি এনহাইবারনেট ডকুমেন্টেশনে পেয়েছি (এটি অনন্য কী তৈরির একটি পদ্ধতি, বিভাগ 5.1.4.2), তবে এটি কীভাবে কাজ করে তার কোনও ভাল ব্যাখ্যা আমি পাইনি।

আমি জানি যে নাইবারনেট এটি পরিচালনা করে, এবং আমার ভিতরে জানার দরকার নেই, তবে আমি কেবল কৌতূহলী।

উত্তর:


540

প্রাথমিক ধারণাটি হ'ল একটি প্রাথমিক কী- একটি "উচ্চ" নম্বর এবং একটি "কম" নম্বর তৈরির জন্য আপনার কাছে দুটি সংখ্যা রয়েছে। কোনও ক্লায়েন্ট মূলত "উচ্চ" অনুক্রমটি বৃদ্ধি করতে পারে, তা জেনেও যে এটি "কম" মানের বিভিন্নতার সাথে পূর্ববর্তী "উচ্চ" মানের পুরো পরিসর থেকে নিরাপদে কী তৈরি করতে পারে।

উদাহরণস্বরূপ, ধরুন আপনার বর্তমান মান 35 এর সাথে "উচ্চ" ক্রম রয়েছে এবং "কম" সংখ্যাটি 0-1023 এর মধ্যে রয়েছে। তারপরে ক্লায়েন্টটি ক্রমটি 36 এ বৃদ্ধি করতে পারে (অন্য ক্লায়েন্টরা 35 টি ব্যবহারের সময় কী তৈরি করতে সক্ষম হবে) এবং জেনে নিন কীগুলি 35/0, 35/1, 35/2, 35/3 ... 35/1023 সমস্ত উপলব্ধ।

প্রাথমিক কী ছাড়া মান সন্নিবেশ করা এবং তারপরে ক্লায়েন্টের কাছে ফিরিয়ে আনার পরিবর্তে ক্লায়েন্টের পাশে প্রাথমিক কীগুলি সেট করতে সক্ষম হয়ে এটি (বিশেষত ওআরএম সহ) খুব কার্যকর হতে পারে। অন্য যে কোনও কিছু বাদ দিয়ে, এর অর্থ হ'ল আপনি যে কোনও সন্নিবেশ করার আগে সহজেই পিতামাতার / সন্তানের সম্পর্ক তৈরি করতে পারেন এবং কীগুলি সব জায়গায় রেখে দিতে পারেন , যা তাদের ব্যাচিংকে আরও সহজ করে তোলে।


14
আপনি কি বলছেন যে "নিম্ন রেঞ্জগুলি" ক্লায়েন্টের মধ্যে সমন্বিত হয়, যখন "হাই সিকোয়েন্স" একটি ডিবি অনুক্রমের সাথে মিলে যায়?
ক্রিস নো

14
হাই ও লো মানগুলি কি তখন সাধারণত একটি একক পূর্ণসংখ্যার মান বা দ্বি-অংশ ব্যবসায় কী হিসাবে তৈরি হয়?
ক্রিস নো

51
কোনও আইপি ঠিকানার মতো - আইসিএনএএন আপনাকে একটি উচ্চ 'নেটওয়ার্ক' নম্বর দেয়, তারপরে আপনার দেওয়া সিআইডিআর সীমার সীমার মধ্যে আপনার পছন্দমতো কম 'হোস্ট' নম্বর থাকে।
gbjbaanb

6
@ অ্যাডাম: মৌলিকভাবে, কিছুই নয় - এটি একগুচ্ছ কী তৈরি করার চেয়ে এক মান ("উচ্চ" অংশ) বাড়ানো থেকে সম্ভাব্য সস্তা। ( ডেটা স্থানান্তরের ক্ষেত্রে এটি সম্ভবত অনেক কম সস্তা - আপনি ন্যূনতম ব্যান্ডউইদথ সহ বিশাল সংখ্যক কীগুলি "সংরক্ষণ" করতে পারেন))
জোন স্কেট

4
@ অ্যাডাম: কীগুলি কেবল সংখ্যা হলে এটি সত্য। জিইউইডিগুলির পক্ষে তেমন কিছু নয় :) তবে হ্যাঁ, সাধারণ সংখ্যার ক্ষেত্রে কোনও নির্দিষ্ট পারমাণবিক "নির্দিষ্ট পরিমাণে বৃদ্ধি" করবে will এটি কার্যকরভাবে হাই-লো কী করছে, যদি আপনি এটি একটি সংখ্যা দুটি বিভাগে বিভক্ত হিসাবে মনে করেন।
জন স্কিটি

157

জনের উত্তর ছাড়াও:

এটি সংযোগ বিচ্ছিন্ন কাজ করতে সক্ষম হতে ব্যবহৃত হয়। তারপরে একটি ক্লায়েন্ট সার্ভারকে হাই সংখ্যার জন্য জিজ্ঞাসা করতে পারে এবং লো সংখ্যাটি নিজেই বাড়িয়ে দেয় objects লো রেঞ্জটি ব্যবহার না করা অবধি সার্ভারের সাথে যোগাযোগ করার প্রয়োজন নেই।


1
আমি বংশবৃদ্ধির জন্য এই পছন্দ।
বিকাশকারী মারিয়াস ইলানাস

34

যেহেতু এটি একটি খুব সাধারণ প্রশ্ন, আমি এই নিবন্ধটি লিখেছি , যার ভিত্তিতে এই উত্তরটি ভিত্তিক।

হাই / লো আলগোরিদিমগুলি সিকোয়েন্স ডোমেনটিকে "হাই" গ্রুপে বিভক্ত করে। একটি "হাই" মান সিঙ্ক্রোনসিভভাবে নির্ধারিত হয়। প্রতিটি "হাই" গোষ্ঠীকে সর্বাধিক সংখ্যক "লো" এন্ট্রি দেওয়া হয়, যা সমবর্তী নকল প্রবেশের বিষয়ে চিন্তা না করে অফ-লাইন দ্বারা নির্ধারিত হতে পারে।

  1. "হাই" টোকনটি ডাটাবেস দ্বারা বরাদ্দ করা হয়েছে, এবং দুটি সমবর্তী কলগুলি অনন্য পরপর মানগুলি দেখার গ্যারান্টিযুক্ত
  2. একবার "হাই" টোকেনটি পুনরুদ্ধার করা হলে আমাদের কেবলমাত্র "ইনক্রিমেন্টসাইজ" ("লো" এন্ট্রিগুলির সংখ্যা) প্রয়োজন
  3. সনাক্তকারীদের পরিসরটি নিম্নলিখিত সূত্র দ্বারা দেওয়া হয়েছে:

    [(hi -1) * incrementSize) + 1, (hi * incrementSize) + 1)

    এবং "লো" মানটি সীমার মধ্যে থাকবে:

    [0, incrementSize)

    এর শুরুর মান থেকে প্রয়োগ করা হচ্ছে:

    [(hi -1) * incrementSize) + 1)
  4. যখন সমস্ত "লো" মান ব্যবহৃত হয়, একটি নতুন "হাই" মান পাওয়া যায় এবং চক্রটি অবিরত থাকে

আপনি এই নিবন্ধে আরও বিস্তারিত ব্যাখ্যা পেতে পারেন :

এবং এই চাক্ষুষ উপস্থাপনাটি অনুসরণ করাও সহজ:

এখানে চিত্র বর্ণনা লিখুন

হাই / লো অপ্টিমাইজার সনাক্তকারী প্রজন্মকে অনুকূলকরণের জন্য ঠিক আছে, তবে এটি আমাদের সনাক্তকারী কৌশল সম্পর্কে কিছু না জেনে আমাদের ডাটাবেসে সারি সন্নিবেশ করানো অন্য সিস্টেমগুলির সাথে ভাল খেলছে না।

হাইবারনেটটি পুলড লো অপ্টিমাইজারটি সরবরাহ করে, যা হাই / লো জেনারেটর কৌশলটির সুবিধাগুলি সরবরাহ করে এবং তৃতীয় পক্ষের ক্লায়েন্টদের সাথে ইন্টারঅ্যাপেরিবিলিটি সরবরাহ করে যা এই ক্রম বরাদ্দ কৌশল সম্পর্কে অবগত নয়।

অন্যান্য সিস্টেমের সাথে উভয়ই দক্ষ এবং আন্তঃযোগাযোগ্য হওয়ায়, পুলযুক্ত লো অপ্টিমাইজারটি উত্তরাধিকারের হাই / লো সনাক্তকারী কৌশলের চেয়ে অনেক ভাল প্রার্থী।


আমি আপনাকে মাঝেমধ্যে বুঝতে পারি না হাহাহাহা: হাই / লো অপ্টিমাইজার সনাক্তকারী প্রজন্মকে অনুকূল করার জন্য ভাল (ভাল ভাল), এটি অন্যান্য সিস্টেমগুলির সাথে ভাল খেলছে না (অন্যান্য সিস্টেম বলতে কী বোঝ? বেশী?) আমাদের সনাক্তকারী কৌশল সম্পর্কে কিছু না জেনে, আমাদের ডাটাবেসে সারি সন্নিবেশ করানো (শনাক্তকারী প্রজন্ম কী সারিগুলি সন্নিবেশ করানোর জন্য ব্যবহৃত হয় না?)।
অ্যাডেলিন

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

মন্তব্যটি যদি আপনার উত্তরের জন্য উপযুক্ত না হয় তবে আমার ক্ষমাপ্রার্থনা, তবে আমি ভাবছিলাম যে ডিফল্টরূপে অপটিমাইজারটি কী ব্যবহৃত হয়? বা এটি ডিবির উপর নির্ভর করে (আমি পোস্টগ্রিজ এসকিউএল ব্যবহার করছি)? কারণ আমি বর্তমান সিকোয়েন্স মান এবং উত্পন্ন আইডিগুলির মধ্যে সম্পর্ক খুঁজে বের করতে পারি না। আমি @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "name") @SequenceGenerator(name="name", sequenceName = "name_seq", allocationSize=100)আমার আইডি ব্যবহার করছি
স্টিফান গোলুবুভিć

1
হাইবারনেট 5 যেহেতু, পুলড নতুন অপটিমাইজার, হাই / লো নয়। পরীক্ষা করে দেখুন আরো বিস্তারিত জানার জন্য এই নিবন্ধটি পুঞ্জিকৃত অপ্টিমাইজার সম্পর্কে।
ভ্লাদ মিহলসিয়া

@ ভ্লাদমিহালসিয়া, আমি বিশ্বাস করি বুলেট থ্রি-তে আপনার টাইপো আছে, প্রথম স্নিপেটে , (hi * incrementSize) + 1)... এটি হওয়া উচিত , hi * incrementSize), তাই না?
হুয়াগান

23

লো হ'ল একটি ক্যাশেড বরাদ্দকারী যা সাধারণত কিছু মেশিন শব্দের আকারের উপর ভিত্তি করে অর্থপূর্ণ আকারের রেঞ্জগুলি (যেমন একসাথে 200 টি চাবি অর্জন করতে পারে) এর পরিবর্তে কিংসস্পেসকে বড় অংশগুলিতে বিভক্ত করে যা কোনও মানুষ সম্ভবত বোধগম্যভাবে চয়ন করতে পারে।

হাই-লো ব্যবহারের ফলে সার্ভার পুনঃসূচনাতে প্রচুর পরিমাণে কীগুলি নষ্ট হয়ে যায় এবং বৃহত্তর মানব-বন্ধুত্বপূর্ণ কী মান তৈরি হয়।

হাই-লো বরাদ্দকারীর চেয়ে ভাল হ'ল "লিনিয়ার কাঙ্ক" বরাদ্দকারী। এটি একই ধরণের টেবিল-ভিত্তিক নীতি ব্যবহার করে তবে ছোট, সুবিধামত আকারের অংশগুলি বরাদ্দ করে এবং সুন্দর মানব-বান্ধব মান উত্পন্ন করে।

create table KEY_ALLOC (
    SEQ varchar(32) not null,
    NEXT bigint not null,
    primary key (SEQ)
);

পরবর্তী বরাদ্দ করতে, বলুন, 200 কী (যা তখন সার্ভারে একটি পরিসীমা হিসাবে ধরে রাখা হয় এবং প্রয়োজন হিসাবে ব্যবহৃত হয়):

select NEXT from KEY_ALLOC where SEQ=?;
update KEY_ALLOC set NEXT=(old value+200) where SEQ=? and NEXT=(old value);

আপনি এই লেনদেন প্রতিশ্রুতিবদ্ধ করতে পারেন (বিতর্ক পরিচালনা করতে পুনরায় চেষ্টা করুন), আপনি 200 টি কী বরাদ্দ করেছেন এবং প্রয়োজনীয় হিসাবে সেগুলি সরবরাহ করতে পারেন।

মাত্র ২০ টির আকারের এই স্কিমটি ওরাকল সিকোয়েন্স থেকে বরাদ্দের চেয়ে 10x দ্রুত এবং সমস্ত ডাটাবেসের মধ্যে 100% বহনযোগ্য। বরাদ্দ কর্মক্ষমতা হাই-লো সমতুল্য।

অ্যাম্বিলারের ধারণার বিপরীতে, কী-স্পেসটিকে একটি স্বতন্ত্র লিনিয়ার নম্বররেখার মতো আচরণ করে।

এটি যৌগিক কীগুলির জন্য অনুপ্রেরণা এড়িয়ে যায় (যা কখনই সত্যিই ভাল ধারণা ছিল না) এবং সার্ভার পুনরায় চালু হওয়ার সময় সম্পূর্ণ লো-শব্দের অপচয় করা এড়ানো যায়। এটি "বন্ধুত্বপূর্ণ", মানব-স্কেলের মূল মান উত্পন্ন করে।

মিঃ অ্যাম্বেলারের ধারণা তুলনা করে উচ্চ 16- বা 32-বিট বরাদ্দ করে এবং হাই-শব্দের বৃদ্ধি হিসাবে বড় মানব-বন্ধুত্বপূর্ণ মূল মান উত্পন্ন করে।

বরাদ্দিত কীগুলির তুলনা:

Linear_Chunk       Hi_Lo
100                65536
101                65537
102                65538
.. server restart
120                131072
121                131073
122                131073
.. server restart
140                196608

নকশা অনুসারে, তার সমাধানটি তুলনামূলক কোনও সুবিধা অর্জন করার সময় লিনিয়ার_চঙ্কের চেয়ে সংখ্যা-লাইনের (সম্মিলিত কীগুলি, বড় হাই-ওয়ার্ড পণ্যগুলি) মূলত আরও জটিল।

হাই-লো নকশা ওও ম্যাপিং এবং অধ্যবসায়ের প্রথম দিকে উত্থাপিত হয়েছিল। এই দিনগুলিতে অধ্যবসায়ের কাঠামো যেমন হাইবারনেট তাদের ডিফল্ট হিসাবে সহজ এবং আরও ভাল বরাদ্দ সরবরাহ করে।


4
ভাল পোস্ট, তবে আপনি প্রশ্নের উত্তর দিচ্ছেন না।
অরবফিশ

1
একটি আকর্ষণীয় উত্তরের জন্য +1। আমি সম্মত হলাম যে অ্যাপ্লিকেশনগুলির সিংহভাগ সহজ পদ্ধতির মাধ্যমে হাই-লো থেকে কোনও সুবিধা অর্জন করে না; তবে আমি মনে করি হাই-লো উচ্চতর সমবর্তী অ্যাপ্লিকেশনগুলিতে একাধিক বরাদ্দকারীদের বিশেষ ক্ষেত্রে উপযুক্ত।
richj

1
ধন্যবাদ @ রিচজ! আমার বক্তব্যটি হ'ল আপনি "লিনিয়ার ব্লক বরাদ্দ" দিয়ে একাধিক বরাদ্দকারী বা বৃহত ব্লক মাপ ব্যবহার করতে পারেন, তবে এটি - হাই / লো এর বিপরীতে - এটি টেবিলের কীগুলিতে বরাদ্দকারী NEXT_VAL এর রৈখিক চিঠিপত্র বজায় রাখে , এবং টিউনযোগ্য হয়। হায়লো থেকে ভিন্ন, কোনও গুণটির প্রয়োজন নেই - এটি কেবল প্রয়োজনীয় নয়! NEXT_HI এর গুণক এবং স্টোরেজ হায়লোকে আরও জটিল করে তোলে এবং সুরক্ষার জন্য বিরতি দেয়, যেহেতু ব্লকসাইজ পরিবর্তন করা হবে ইচ্ছামতো পরবর্তী কীটি জারি করা হবে তা পরিবর্তন করবে .. দেখুন: সাক্ষরতাজভা
টমাস ডব্লিউ

2
আমি একাধিক স্বতন্ত্র বরাদ্দকারীদের আগ্রহী। হাই-লো দিয়ে এটি সুস্পষ্ট যে উচ্চ মানকে বরাদ্দকারী আইডি / ব্লক আইডিতে বিভক্ত করা যায়। এটি তাত্ক্ষণিকভাবে স্পষ্ট ছিল না (আমার কাছে) যে একই পন্থাটি লিনিয়ার কাঙ্কের ক্ষেত্রে প্রয়োগ করা যেতে পারে তবে এটি মূলত বরাদ্দকারীদের মধ্যে মোট পরিসরকে বিভক্ত করার একই সমস্যা। আমি এখন এটি পেয়েছি। ধন্যবাদ।
richj

1
ওহ, এটি সম্পর্কে চিন্তাভাবনা করার পরে, আমি SEQ কলামটি একটি টেবিলের নাম মানচিত্রের মনে করি। উদাহরণস্বরূপ, গ্রাহক টেবিলের একটি বরাদ্দকারী রয়েছে, অর্ডার সারণীর জন্য একটি এবং আরও কিছু কিছু। আমাকে ক্ষমা করুন, আমি আস্তে আছি, মাঝে মাঝে।
রক অ্যান্টনি জনসন

1

আমি দেখতে পেয়েছি যে হাই / লো অ্যালগরিদম আমার অভিজ্ঞতার ভিত্তিতে প্রতিরূপের পরিস্থিতিতে একাধিক ডাটাবেসের জন্য উপযুক্ত। এটি কল্পনা করুন. আপনার নিউ ইয়র্কে একটি সার্ভার রয়েছে (ওরফে 01) এবং লস অ্যাঞ্জেলেসে অন্য একটি সার্ভার রয়েছে (ওরফে 02) তারপরে আপনার একটি ব্যক্তিগত টেবিল রয়েছে ... সুতরাং নিউ ইয়র্কে যখন কোনও ব্যক্তি তৈরি হয় ... আপনি সর্বদা এইচআই মান হিসাবে 01 ব্যবহার করেন এবং এলও মান হ'ল পরবর্তী সিক্যুয়ালিয়াল। উদাহরণ উদাহরণ।

  • 010000010 জেসন
  • 010000011 ডেভিড
  • 010000012 থিও

লস অ্যাঞ্জেলেসে আপনি সবসময় এইচআই 02 ব্যবহার করেন example উদাহরণস্বরূপ:

  • 020000045 রূপান্তর
  • 020000046 ওসওয়াল্ড
  • 020000047 মারিও

সুতরাং, যখন আপনি ডাটাবেসের অনুলিপি ব্যবহার করেন (কোনও ব্র্যান্ডই হোক না কেন) সমস্ত প্রাথমিক কী এবং ডেটা সহজে এবং প্রাকৃতিকভাবে ডুপ্লিকেট প্রাথমিক কী, সংঘর্ষ ইত্যাদি সম্পর্কে চিন্তা না করেই একত্রিত হয়

এই দৃশ্যে যাওয়ার সেরা উপায়।


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