অ্যালগরিদমগুলি বাছাই করুন যা প্রচুর পরিমাণে ডেটাতে কাজ করে


12

আমি অ্যালগরিদমগুলি বাছাইয়ের জন্য খুঁজছি যা প্রচুর পরিমাণে ডেটাতে কাজ করতে পারে, অর্থাত্ যখন পুরো ডেটা সেটটি একবারে মূল স্মৃতিতে রাখা যায় না তখনও এটি কাজ করতে পারে।

আমি এখন পর্যন্ত পাওয়া একমাত্র প্রার্থী হ'ল মার্জ সাজান: আপনি অ্যালগরিদমটি এমনভাবে প্রয়োগ করতে পারেন যে এটি একবারে মুখ্য স্মৃতিতে সমস্ত ডেটা না রেখে প্রতিটি মার্জে আপনার ডেটা সেটটিকে স্ক্যান করে। আমার মনে থাকা মার্জ সাজানোর বিভিন্নতা এই নিবন্ধে টেপ ড্রাইভের সাথে ব্যবহার বিভাগে বর্ণিত হয়েছে ।

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

সম্পাদনা

উত্তরের প্রয়োজন অনুসারে এখানে আরও কিছু বিবরণ দেওয়া হল:

  • ডেটা পর্যায়ক্রমে বাছাই করা প্রয়োজন, যেমন মাসে একবার a আমার কয়েকটি রেকর্ড সন্নিবেশ করার প্রয়োজন নেই এবং ডেটা বর্ধিতভাবে সাজানো দরকার have
  • আমার উদাহরণ পাঠ্য ফাইলটি প্রায় 1 গিগাবাইট ইউটিএফ -8 পাঠ্য, তবে আমি সাধারণভাবে সমস্যাটি সমাধান করতে চেয়েছিলাম, যদিও ফাইলটি ছিল, বলুন, 20 জিবি।
  • এটি কোনও ডাটাবেসে নেই এবং অন্যান্য বাধাগুলির কারণে এটি হতে পারে না।
  • পাঠ্য ফাইল হিসাবে অন্যরা ডেটা ফেলে দেয়, এই পাঠ্য ফাইলটি পড়ার জন্য আমার নিজের কোড রয়েছে।
  • ডেটা ফর্ম্যাট একটি পাঠ্য ফাইল: নতুন লাইন অক্ষর রেকর্ড বিভাজক হয়।

একটি সম্ভাব্য উন্নতি যা আমি মনে রেখেছিলাম তা হ'ল মেমরির আকারে বাছাই করার জন্য যথেষ্ট ছোট ফাইলগুলিতে ফাইলটি বিভক্ত করা এবং অবশেষে আমি উপরে বর্ণিত অ্যালগরিদম ব্যবহার করে এই সমস্ত ফাইলগুলি মার্জ করে।


1
কি ধরনের তথ্য? বিভিন্ন ডেটা সেটগুলির অর্থ ভিন্ন ভিন্ন অ্যালগরিদম হতে পারে যা আপনার উদ্দেশ্য অনুসারে সেরা suit
15

এটি একটি পাঠ্য ফাইল এবং আমাকে লাইনগুলি বাছাই করতে হবে। লাইনগুলি নির্দিষ্ট দৈর্ঘ্য নয় তবে দৈর্ঘ্য খুব বেশি পরিবর্তিত হয় না (রেকর্ডে প্রায় 50 টি অক্ষর)।
জর্জিও

3
আমি আপনার পরিবেশ বা আপনার সীমাবদ্ধতাগুলি জানি না, তবে যখনই সম্ভব সম্ভব বাছাইয়ের জন্য একটি ডাটাবেস ব্যবহার করব। কারণ এটি প্রায় 100% ত্রুটি-প্রমাণ এবং আমার কোডের চেয়ে অনেক বেশি কার্যকর হবে।
NoChance

আমি লিনাক্স / জাভাতে কাজ করছি। আমি মার্জ সাজ্ট বাস্তবায়ন করেছি এবং এটি বেশ সুচারুভাবে কাজ করছে বলে মনে হচ্ছে। কয়েক মিলিয়ন লাইন বাছাই করতে বেশ কিছুটা সময় লাগে তবে আমার কেবল একবারে এটি করা দরকার।
জর্জিও

@ জর্জিও, আপনি ভালো একটি এলগরিদম প্রয়োগ করেছেন তা ভাল। উত্পাদন কাজের জন্য, আমি এখনও আপনাকে একটি ডেটাবেস ব্যবহার করার পরামর্শ দিচ্ছি। কেবল গতির জন্য নয়, নির্ভরযোগ্যতা এবং রক্ষণাবেক্ষণের স্বাচ্ছন্দ্যের জন্যও।
NoChance

উত্তর:


13

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

বইটি মূলত তখনই লেখা হয়েছিল যখন কম্পিউটারগুলি এখনকার তুলনায় অনেক ছোট এবং ধীর ছিল, যা মেমোরি আউট বাছাইয়ের কৌশলগুলি আজকের তুলনায় বেশি গুরুত্বপূর্ণ বলে মনে করা হয়েছিল important


2
রেফারেন্সের জন্য ধন্যবাদ: আমি প্রায় নিশ্চিত যে আমি নুথের বইতে আকর্ষণীয় উপাদান খুঁজে পাব। আমি নিশ্চিত নই যে মেমরির বহির্মুখী বাছাইয়ের কৌশলগুলি আজ প্রাসঙ্গিক নয়। হয়তো সাধারণ, প্রতিদিনের কাজের জন্য নয়, তবে আমি কল্পনা করতে পারি যে এখনও অনেকগুলি পরিস্থিতি রয়েছে যেখানে খুব বড় ডেটা সেটগুলি প্রক্রিয়া করা প্রয়োজন।
জর্জিও

নুথের অ্যালগরিদম সর্বদা সহায়ক। উদাহরণস্বরূপ হিপ-বাছা বাফারের সাথে মার্জ করা বাছাই করা খুব কার্যকর এবং কার্যকর করা খুব সহজ হতে পারে।
সুলতান

4
একটি খুব দরকারী উত্তর নয় কারণ রেফারেন্স করা উপাদানগুলি বিনামূল্যে নয়। ওপি-র জন্য, আমি উত্তরের জন্য গুগল করার পরামর্শ দিচ্ছি। ওয়েবের চারপাশে খনন করে আপনি যখন এই জাতীয় তথ্য সন্ধান করতে পারেন তখন আপনাকে বই পেতে $ 50 টাকা শেল দেওয়ার দরকার নেই। অবশ্যই, আপনি সম্ভবত এটি নির্দিষ্ট কিছু সাইট ( অহেম ) থেকে বিনামূল্যে ডাউনলোড করতে পারেন । কোনও স্বীকৃত উত্তরের ભાગ્યેই যোগ্য।
থমাস এডিং

1
@ থমাসডিং, "লাইব্রেরি" নামে পরিচিত এই জিনিসগুলি রয়েছে, এতে প্রচুর পরিমাণে এই অপ্রচলিত তথ্য স্টোরেজ এবং "বই" নামক পুনরুদ্ধার ডিভাইস রয়েছে। "গ্রন্থাগার" বিনামূল্যে booksণের জন্য "বই" উপলব্ধ করে। যদি আপনার নির্দিষ্ট "গ্রন্থাগার" -তে আপনার সন্ধানের জন্য নির্দিষ্ট "বই" না থাকে তবে তারা "আন্তঃগ্রহী loanণ" নামে একটি নিখরচায় পরিষেবাও সরবরাহ করে, যা "গ্রন্থাগারকে" অন্য "লাইব্রেরি" থেকে "বই" ধার করতে দেয়, তাই তারা পারে আপনি এটি loanণ।
জন আর স্ট্রোহম

6

ইউএনআইএক্স sortকমান্ডের মতো বহিরাগত আর-ওয়ে সংযুক্তি একটি ভাল বিকল্প। আপনার সূচনা থেকে, আমি নিশ্চিত নই যে এটি "মার্জ সাজান" দিয়ে বোঝানো অ্যালগরিদম কিনা এবং যদি আপনি এটি জানেন না, তবে একবার দেখুন।


ধন্যবাদ। বাহ্যিক আর-ওয়ে মার্জটি আমার মনে থাকা থেকে আলাদা বলে মনে হচ্ছে। আকর্ষণীয় পড়া।
জর্জিও

4

আরও সুনির্দিষ্ট ছাড়াই "মার্জ বাছাই করুন" সম্ভবত আপনি পাবেন সেরা উত্তর, তবে আপনি আপনার প্রয়োজনীয়তার উপর নির্ভর করে আরও কিছু স্মার্ট কিছু বাস্তবায়ন করতে পারেন।

উদাহরণস্বরূপ, আপনি কেবল ফাইলের একটি ইন-মেমরি সূচক তৈরি করতে পারেন তবে বিভিন্ন মূল মানগুলির অবস্থানটি ক্যাশে করে একবারে সমস্ত মান অনুলিপি করতে পারেন? 1/2 একবারে মেমরিতে ফিট করে, বা 1/1000000? এটি যদি দ্বিতীয়টি হয় তবে আপনি মেমরির কোনও সূচক মাপসই করতে পারবেন না, যদি প্রথমটি হয় তবে আপনি উভয় অর্ধকে আরও দক্ষতার সাথে বাছাই করতে পারেন তবে এগুলি একক শেষ ধাপে একত্রিত করুন।

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

আপনি যদি একবারে এটি করতে চান এবং খুব দ্রুত হ্যাকের সন্ধান করছেন তবে মনে হচ্ছে আপনি ইউনিক্স চালাচ্ছেন তবে বাহ্যিক সংযুক্তি বাছাই করা ভাল শুরু হবে (যেহেতু এটি স্পষ্টতই অন্তর্নিহিত)

যদি আপনাকে এটিটি ক্রমে রাখতে হয় এবং সর্বদা একটি একক রেকর্ড যুক্ত করা থাকে তবে সন্নিবেশ সাজানোর প্রয়োজন হবে (সাজানো ডেটাতে একক রেকর্ড যুক্ত করা সর্বদা একটি সন্নিবেশ সাজানো))

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

তাই:

  • জায়গায় বা একাধিক ফাইল?
  • একটি সময়, সাময়িকী বা এটি সর্বদা বাছাই করা আছে?
  • মেমরির চেয়ে কত বড় (পুরো ডেটা সেটটি দিয়ে কত স্মৃতি-লোড পাবে)?
  • এটি কি একটি ডাটাবেসে আছে? এটা হতে পারে?
  • আপনি কি ডেটা পড়ার কোডটি নিয়ন্ত্রণ করেন, বা অন্যরা সরাসরি কোনও ফাইল ডাম্প করবে?
  • ফাইলের বিন্যাস? (পাঠ্য? স্থির রেকর্ড?)
  • অন্য কোন বিশেষ পরিস্থিতিতে আমি জিজ্ঞাসা করিনি?

উত্তর করার জন্য ধন্যবাদ. "জায়গায় বা একাধিক রেকর্ডে" বলতে কী বোঝ?
জর্জিও

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

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

কোডের সাহায্যে আপনি আউটপুটটি ব্যাখ্যা করতে পারেন বা এটি কোনও নির্দিষ্ট বিন্যাসে থাকতে হবে (ফ্ল্যাট টেক্সট ফাইল?) এটি কতবার বাছাই করা প্রয়োজন - প্রতিবার কোনও কিছু যুক্ত করা বা কেবল মাঝে মাঝে? কিছু যুক্ত করা গেলে এটি কেবল শেষের সাথে যুক্ত হয় বা আপনি কোড যুক্ত করতে পারেন যা এটি যুক্ত করে?
বিল কে

প্রতিটি লাইন একটি রেকর্ডে পার্স করা যায় (ফাইলটি একটি সিএসভি ফাইল) তবে বেশিরভাগ ক্ষেত্রই পাঠ্য। এটি একবারে বাছাই করা দরকার (উদাহরণস্বরূপ প্রতি মাসে) এবং আমার বর্তমান বাস্তবায়নটি সাজানোর জন্য প্রায় 1 ঘন্টা সময় নেয়। একটি লাইন সন্নিবেশ করানোর জন্য আমি কোডটি লিখতে পারতাম যা সঠিক জায়গায় লাইনটি সন্নিবেশ করায়: আমার এখন পর্যন্ত যে কোডটি রয়েছে তা দিয়ে এই জাতীয় সরঞ্জামটি লিখতে আমার 20 মিনিট সময় লাগবে।
জর্জিও

3

আপনি যদি সত্যিই একটি স্কেলযোগ্য সমাধান চান তবে আপনার টেরাসর্টের দিকে নজর দেওয়া উচিত, মানচিত্র-হ্রাস সহ স্ট্যান্ডার্ড সাজানোর প্রয়োগ; স্ট্যাকওভারফ্লো সম্পর্কে আরও বিশদ


1
+1: আকর্ষণীয় লিঙ্ক। একত্রিত না করা মানচিত্রের উদাহরণ / হ্রাসের উদাহরণ যেখানে মানচিত্র উপ-তালিকাগুলি বাছাইয়ের সাথে মিলে যায়, এবং সংযুক্তির সাথে মিলিত হয়?
জর্জিও

এটি সম্ভবত দেখা যেতে পারে তবে আপনি নিজের জন্য এটি লেখার পরিবর্তে হাদুপকে এটি করার জন্য ব্যবহার করতে পারেন।
m3th0dman

1

আপনি বালতি বাছাই করতে আগ্রহী হতে পারে । গড় ক্ষেত্রে পারফরম্যান্স লিনিয়ার সময়।

= O (n + d) n: উপাদানের সংখ্যা এবং d = বৃহত্তম সংখ্যার দৈর্ঘ্য যদি আপনার ডেটা সম্পর্কে কোনও অন্তর্দৃষ্টি থাকে। আপনি যদি জানেন যে কতগুলি 'অঙ্ক' দীর্ঘতম আপনার বৃহত্তম সংখ্যা। সুতরাং আপনার যদি 2 মিলিয়ন 6 ডিজিট সংখ্যা থাকে => 0 (এন) এভাবে রৈখিক।


0

বাহ্যিক সংযোজন বাছাই অ্যালগরিদম (যদি আপনার ডেটা ধারাবাহিক হয়), বা বকেটগুলির জন্য বাছাইয়ের প্রয়োগ হিসাবে গণনার ক্রম সহ একটি বালতি সাজ্ট ব্যবহার করুন (যদি আপনার ডেটাটি আলাদা এবং অভিন্নভাবে বিতরণ করা হয়)।

বর্ধিততা যদি কম হয় তবে আপনার নিজের সূচক / ম্যাপিং ফাইলটি তৈরি করা সম্ভবত সর্বোত্তম পন্থা।

  1. কোনওভাবে আপনার "ডাটাবেস" অর্ডার করুন
  2. প্রতিটি প্রবেশের জন্য একটি পূর্ণসংখ্যা বরাদ্দ করুন (1, 2, 3, 4, ..., এন) (আরও ভাল: কিছু বিচ্ছিন্ন সূচকগুলি ব্যবহার করুন)
  3. বর্ধন যোগ করার সময় কেবল একটি ফাঁক সন্ধান করুন যেখানে বাম সংখ্যাটি কম বা সমান এবং ডান সংখ্যাটি বৃহত্তর বা সমান (বাইনারি অনুসন্ধানের কিছু সংশোধিত সংস্করণে এটি অসুবিধা হওয়া উচিত নয়)
  4. সন্নিবেশ করুন, যদিও ফাঁকগুলি পর্যাপ্ত পরিমাণে বড়, যদি না হয়: কেবল পুনরায় সূচি (আবার কখনও সাজান না) :-)

0

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

আমি একটি একক মেশিনে 9 ঘন্টা মধ্যে 128 জিবি ডেটা (প্রতিটি আইটেম 100 বাইট) বাছাই করতে পারি এবং তারপরে বাইনারি প্রায় সময় না দিয়ে সাজানো ডেটা সন্ধান করতে পারি।

আমার ওপেন সোর্স বড় সারি এবং বড় অ্যারে স্ট্রাকচারগুলি ব্যবহার করে কীভাবে বড় ডেটা অনুসন্ধান করা যায় সে সম্পর্কে একটি পোস্ট এখানে

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