মেমরি ইনডেক্সের জন্য স্ন্যাপশোটেবল ডেটা স্ট্রাকচার


12

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

  • বৈশিষ্ট্য / বৈশিষ্ট্যের সেট দ্বারা অবজেক্ট / -গুলি পান (এক্সপ্রেশনগুলির জন্য সমর্থন থাকতে পারে, যেমন x.count < 5)
  • বস্তুর বৈশিষ্ট্য পান ute

একটি ক্যোয়ারী একটি অপরিহার্য স্ক্রিপ্ট যা উপরের ক্রিয়াকলাপগুলির একটি স্বেচ্ছাসেবী সংখ্যার সমন্বয়ে গঠিত। ডেটা আকার হবে << মেমরির, সুতরাং বেশিরভাগ বৈশিষ্ট্যের সমস্ত অবজেক্ট এবং সূচকগুলি অদলবদল না করে স্বাচ্ছন্দ্যে মাপসই করা উচিত।

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

আমি খুঁজছেন ছিল CTries , সমসাময়িক BSTs এবং সমসাময়িক চ্যাটালো গাছ কিন্তু আমি নিশ্চিত যদি আমি সত্যিই এখানে ডান দিক দেখছি নই। উপরোক্ত স্ট্রাকচারগুলি আমি সন্নিবেশ করানোর জটিলতাগুলিতে প্রচুর মনোযোগ দিই।

প্রশ্ন : বাক্সের বাইরে আমার ব্যবহারের ক্ষেত্রে কী উপযুক্ত ডাটা স্ট্রাকচার উপযুক্ত?

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


1
আপনার কি স্মৃতিতে স্ন্যাপশট প্রয়োজন, না আপনার সেগুলি ডিস্ক / নেটওয়ার্কে সংরক্ষণ করতে হবে? একটি সম্পূর্ণরূপে কার্যকরী ডেটা স্ট্রাকচার আপনাকে স্বয়ংক্রিয়ভাবে মেমরির স্ন্যাপশট দেয়, সুতরাং যদি আপনার এটির প্রয়োজন হয় তবে এটি আপনার সেরা বাজি।
গিলস 'অশুভ হওয়া বন্ধ করুন'

সবই স্মৃতিতে। আমি ভাবছিলাম যে একটি ধ্রুবক-সময় স্ন্যাপশট (কেবল সিটরির মতো, কেবল সমকালীন লেখাগুলি ব্যতীত) একটি কার্যকর পরিবর্তনীয় সংস্করণ রয়েছে।
dm3

2
আপনার সমস্যাটি ডেটা স্ট্রাকচারের পছন্দ কম, তবে এক ধরণের নিয়ন্ত্রণমূলক নিয়ন্ত্রণ হতে পারে।
রাফেল

এটা ভাল হতে পারে, আপনি কি আরও কিছুটা বিস্তারিত বলতে পারেন?
dm3

উত্তর:


5

যে কোনও ধরণের স্থায়ী / অপরিবর্তনীয় (যেমন, কার্যকরী) গাছ ভিত্তিক ডেটা স্ট্রাকচার ব্যবহার করুন। @ রাফাল মন্তব্যে উল্লেখ করেছেন বলে কীটি ঠিকমতো লকিং পাচ্ছে।

ক্রিয়ামূলক / অবিচলিত গাছ-ভিত্তিক ডেটা স্ট্রাকচার সম্পর্কে দুর্দান্ত জিনিসটি হ'ল আপনি "স্ন্যাপশট" বিনামূল্যে পান। ধরা যাক আপনি আপনার ডেটা কাঠামোর জন্য ট্র্যাপ (এলোমেলোভাবে বাইনারি অনুসন্ধান ট্রি) ব্যবহার করেন use এখানে যান: https://github.com/steveyen/gtreap- তে লিখিত একটির উদাহরণ । লেখক এটিকে এভাবে বর্ণনা করেছেন:

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

যে কোনও সময়ে গাছের "বর্তমান" অবস্থা গাছের মূলের দিকে নির্দেশক দ্বারা প্রতিনিধিত্ব করা হয়। সন্নিবেশগুলি পরিবর্তনহীন। পরিবর্তে একটি সন্নিবেশ গাছের পূর্ববর্তী সংস্করণটিকে সম্পূর্ণ অক্ষত রাখে, শিকড় থেকে সঠিক সন্নিবেশ বিন্দুতে পাথের জন্য নতুন নোড তৈরি করে, পূর্ববর্তী সংস্করণের নোডগুলিতে পয়েন্টার সহ যা ভাগ করা যায়।O(logn)

মূলটিতে পয়েন্টারটি সুরক্ষিত করতে আপনি একটি লক ব্যবহার করেন। যেহেতু ডেটা স্ট্রাকচার অপরিবর্তনীয় পঠন একই সাথে করা যায় এবং আপনি পয়েন্টারগুলিকে পুরানো স্ন্যাপশটে সংরক্ষণ করতে পারেন। একটি পঠন হল:

lock
tmp = ptr_to_root
unlock
value = search(tmp, <value to search for>)
return value

যদিও অনুসন্ধানে কিছুটা সময় নিতে পারে, আপনি কেবলমাত্র পয়েন্টারটি অনুলিপি করার সময় লকটি ধরে রাখেন, যাতে অনুসন্ধানগুলি একই সাথে ঘটতে পারে।

একটি লেখাটি হ'ল:

lock
old_ptr_to_root = ptr_to_root
ptr_to_root = insert(old_ptr_to_root, <new key/value pair>)
unlock

এই সংস্করণে, লেখকে গাছের নতুন সংস্করণ তৈরির পুরো প্রক্রিয়া চলাকালীন লক ধরে রাখা দরকার। আপনি লেখার পারফরম্যান্সকে উন্নত করতে পারেন (কখনও কখনও লেখার লেনদেন ব্যর্থ হওয়ার বিনিময়ে) লেখাকে এই জাতীয় কিছুতে পরিবর্তন করে:

top:
  lock
  old_ptr_to_root = ptr_to_root
  unlock
  new_ptr_to_root = insert(old_ptr_to_root, <new key/value pair>)
  lock
  if (ptr_to_root == old_ptr_to_root)   # make sure no other write happened in the interim
    ptr_to_root = new_ptr_to_root
    unlock
  else                                  # transaction fails, try again
    unlock
    goto top

আপনার প্রোগ্রামিং ভাষায় যদি পারমাণবিক তুলনা-ও-স্বাপ ক্রিয়াকলাপের সাথে পারমাণবিক পরিবর্তনশীল থাকে তবে আপনি আরও কিছুটা আরও ভাল করতে সক্ষম হতে পারেন (এটিকে "লক ফ্রি" করুন)। (উদাহরণস্বরূপ সি ++ 11 ব্যবহার করে atomic<T*>))


বিস্তৃত উত্তরের জন্য ধন্যবাদ। আমি এক ধরনের জানতাম, সম্ভবত আমি এ প্রশ্নটিতে এতটা স্পষ্টভাবে লিখিনি। তবে উত্তরটি এখনও দুর্দান্ত!
dm3

আপনার "উন্নত" সংস্করণ ব্যবহৃত সিস্টেমের মেমরি মডেলের উপর নির্ভর করে। কোনও সিস্টেমে অস্থির হিসাবে ঘোষিত হওয়ার জন্য ভেরিবারগুলি ভাল প্রয়োজন এবং কোডিং সঠিক হওয়ার জন্য দুর্দান্ত দক্ষতার প্রয়োজন হতে পারে।
ইয়ান রিংরোজ

1

মাইক্রোসফ্ট তাদের নতুন মেমোরি ডাটাবেসে বিশদ প্রকাশ করেছে, এতে এমন সূচি রয়েছে যা লেখার সময় পঠন বন্ধ করে না।

উদাহরণ স্বরূপ:

জাস্টিন লেভানডোস্কি, ডেভিড লোমেট এবং সুদীপ্ত সেনগুপ্ত, দ্য বিডাব্লু ট্রি: নিউ হার্ডওয়্যারের জন্য বি-ট্রি, ২০১৩ সালে আইইইই ২৯ তম আন্তর্জাতিক সম্মেলন ডেটা ইঞ্জিনিয়ারিং (আইসিডিই), ডেটা ইঞ্জিনিয়ারিং সম্পর্কিত আন্তর্জাতিক সম্মেলন, ৮ এপ্রিল ২০১৩।

তাদের প্রকাশনাগুলির একটি তালিকার জন্য http://research.microsoft.com/en-us/projects/main-memory_dbs/ দেখুন ।

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