উইন্ডোজে একটি অত্যন্ত বড় (800 গিগাবাইট) পাঠ্য ফাইলের সামগ্রীগুলি বাছাই করুন


25

আমার কাছে প্রতিটি লাইনে একটি শব্দ সহ একটি পাঠ্য ফাইল রয়েছে, ফাইলটির আকার 800GB GB আমার শব্দগুলি বর্ণমালা অনুসারে বাছাই করা দরকার।

আমি উইন্ডোজ বাছাই প্রোগ্রামটি ব্যবহার করে চেষ্টা করেছি :

sort.exe input.txt /o output.txt

যা ত্রুটি দেয়: বাছাইটি সম্পূর্ণ করার জন্য পর্যাপ্ত প্রধান মেমরি নেই।

আমার কাছে 32 গিগাবাইট র‌্যাম রয়েছে তাই যখন আমি সাজানোর জন্য 10 গিগাবাইট মেমরি নির্দিষ্ট করার চেষ্টা করি:

sort.exe input.txt /o output.txt /M 10000000

আমি পাই:

সতর্কতা: নির্দিষ্ট মেমরির আকারটি উপলব্ধ পেজিং মেমোরিতে হ্রাস করা হচ্ছে।

ইনপুট রেকর্ড সর্বোচ্চ দৈর্ঘ্য অতিক্রম করেছে। বৃহত্তর সর্বাধিক উল্লেখ করুন।

আমার বিকল্পগুলি কি কি?



10
এটি ক্রস পোস্ট নয়, আমি কোনও মেশিন নই তাই এটি পোস্ট করা এবং অন্যটিকে মুছতে কয়েক মিনিট সময় লাগে!
MaYaN

3
ভবিষ্যতে সম্প্রদায়টিকে আপনার প্রশ্নটি স্থানান্তরিত করার অনুমতি দিন
রামহাউন্ড

4
লিনাক্স সহ, আপনি এই পদ্ধতিটি প্রয়োগ করতে পারেন । 100Mb ফাইল সহ এটি কোনও বড় সমস্যা হওয়া উচিত নয়।
এরিক ডুমিনিল

3
আপনি উইন্ডোজ কোন সংস্করণ ব্যবহার করছেন? বরং পুরানো উইন্ডোজ সার্ভার 2012 আর 2 এর সাথে সাজানো.অ্যাক্সেস দাবি করেছে যে ডিস্কে অস্থায়ী ফাইলের ব্যবহার (কোনও আকারের সীমা নথি ছাড়াই) বাহ্যিক সংযুক্তি বাছাই করতে সক্ষম হবে। অস্থায়ী ফাইলটির জন্য 800 গিগাবাইট সহ একটি ডিস্ক নির্দিষ্ট করতে / টি ব্যবহার করার চেষ্টা করুন। এবং "ইনপুট রেকর্ড সর্বাধিক দৈর্ঘ্য ছাড়িয়ে গেছে" সম্পর্কে বার্তাটি স্থানের সাথে সম্পর্কহীন বলে মনে হচ্ছে - / আরইসি বিকল্পটি দেখুন এবং আপনার লাইন টার্মিনেটরটি কী তা বিবেচনা করুন।
ডেভিডবাক

উত্তর:


16

আমার বিকল্পগুলি কি কি?

ফ্রিওয়্যার কমান্ড লাইন সাজান ইউটিলিটি সিএমএসর্ট চেষ্টা করুন ।

এটি একাধিক অস্থায়ী ফাইলগুলি ব্যবহার করে এবং তারপরে এগুলিকে একত্রিত করে।

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

একজন ব্যবহারকারী রিপোর্ট করেছেন যে এটি 130,000,000 বাইটের একটি ফাইল বাছাই করেছে orted

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


26
বাহ, 130 মেগাবাইট !!! +1
ডেভিড ফোস্টার 21

3
@ ডেভিডপস্টিল আপনি কি নিশ্চিত যে উইন্ডোজের জন্য কোর্টিলগুলি বাছাই করা আরও কার্যকর নয় ( --parallelবিকল্প যদি আপনার একাধিক কোর থাকে ...)?
হাস্তুর

23

অন্য একটি বিকল্প হ'ল ফাইলটি একটি ডেটাবেজে লোড করা। EG মাইএসকিউএল এবং মাইএসকিউএল ওয়ার্কবেঞ্চ।
ডেটাবেসগুলি বড় ফাইলগুলির সাথে কাজ করার জন্য নিখুঁত প্রার্থী

যদি আপনার ইনপুট ফাইলটিতে একটি নতুন লাইনের দ্বারা পৃথক করা মাত্র শব্দ থাকে তবে এটি কঠোর হওয়া উচিত নয়।

আপনি ডাটাবেস এবং মাইএসকিউএল ওয়ার্কবেঞ্চ ইনস্টল করার পরে আপনার যা করা দরকার তা এটি।
প্রথমে স্কিমা তৈরি করুন (এটি ধরে নিয়েছে যে শব্দগুলি আর 255 অক্ষরের বেশি হবে না যদিও আপনি যুক্তির মান বাড়িয়ে এটি পরিবর্তন করতে পারেন)। প্রথম কলাম "আইডওয়ার্ডস" একটি প্রাথমিক কী।

CREATE SCHEMA `tmp` ;

CREATE TABLE `tmp`.`words` (
  `idwords` INT NOT NULL AUTO_INCREMENT,
  `mywords` VARCHAR(255) NULL,
  PRIMARY KEY (`idwords`));

দ্বিতীয়ত ডেটা আমদানি করুন: EG এটি সমস্ত শব্দটি টেবিলের মধ্যে আমদানি করবে (এই পদক্ষেপটি শেষ হতে কিছুটা সময় নিতে পারে My বৃহত্তর একটি (টেবিলটি কেটে দিন .. IE এটি সাফ করুন এবং সম্পূর্ণ ডেটা সেট লোড করুন)।

LOAD DATA LOCAL INFILE "C:\\words.txt" INTO TABLE tmp.words
LINES TERMINATED BY '\r\n'
(mywords);


এই লিঙ্কটি লোডের জন্য সঠিক ফর্ম্যাটটি পেতে সহায়তা করতে পারে। https://dev.mysql.com/doc/refman/5.7/en/load-data.html
EG আপনার যদি প্রথম লাইনটি এড়িয়ে চলার দরকার হয় তবে আপনি নিম্নলিখিতটি করতে চান।

LOAD DATA LOCAL INFILE "H:\\words.txt" INTO TABLE tmp.words
-- FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(mywords);

শেষ পর্যন্ত বাছাই করা ফাইলটি সংরক্ষণ করুন। আপনার পিসির উপর নির্ভর করে এটি কিছুটা সময় নিতে পারে।

SELECT tmp.words.mywords
FROM tmp.words
order by tmp.words.mywords asc
INTO OUTFILE 'C:\\sorted_words.csv';

আপনি নিজের পছন্দ মতো ডেটাও অনুসন্ধান করতে পারেন। EG এটি আপনাকে প্রথম 50 টি শব্দ আরোহণের ক্রমে দেবে (0 তম বা প্রথম শব্দ থেকে শুরু)।

SELECT tmp.words.mywords
FROM tmp.words
order by tmp.words.mywords asc
LIMIT 0, 50 ;

শুভকামনা
পিট


2
এই IS উল্লেখযোগ্য মার্জিন দ্বারা সঠিক উত্তর।
MonkeyZeus

1
এই পদ্ধতির স্পষ্টভাবে আরও নমনীয় হবে, বিশেষত যদি আপনি আবিষ্কার করেন যে আপনাকে একটি আলাদা ক্রমের সাথে বাছাই করে আবার চালানো দরকার, উদাহরণস্বরূপ।
বারবিকিউ 5'18

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

দ্বারা অর্ডার করা mywordsচিরকালের জন্য গ্রহণ করবে। এমনকি LIMIT, এটি পুরো জিনিসটিকে ঠিক ততক্ষণ সময় নেবে কারণ মাইএসকিউএল এর প্রতিটি একক মানের মধ্য দিয়ে যেতে হবে mywordsএবং তাদের অর্ডার করতে হবে। এটি ঠিক করার জন্য, কাজটি করার পরে আপনাকে নিম্নলিখিতগুলি করতে হবে LOAD DATA। এতে একটি সূচক যুক্ত করুন mywords। এখন আপনি column কলামটি দিয়ে অর্ডার করতে পারেন এবং এটি সহস্রাব্দ নিতে হবে না। এবং আপনি টেবিলটি তৈরি করার সময় (অনেক দ্রুত ডেটা লোড) এর চেয়ে ডেটা লোড করার পরে সূচকটি যুক্ত করা ভাল।
বাটল বাটকাস

7

sort

অনেক সাজানোর আদেশ করতে ব্যবহৃত আলগোরিদিম এবং আদেশ ফাইল [ 1 ]
যেহেতু এই সমস্ত অ্যালগোরিদম ইতিমধ্যে প্রয়োগ করা হয়েছে, ইতিমধ্যে পরীক্ষা করা একটি প্রোগ্রাম বেছে নিন।

ইন coreutils (লিনাক্সের থেকে কিন্তু Windows জন্য উপলব্ধ খুব [ 2 ] ), এটি বিদ্যমান sortকমান্ড মাল্টি-কোর প্রসেসর অধীনে সমান্তরাল চালানোর জন্য সক্ষম: সাধারণত এটা যথেষ্ট।

যদি আপনার ফাইলটি এত বিশাল হয় তবে আপনি split -lকিছুটা অংশে ফাইলটি প্রসেসিং বিভক্তকরণ ( ) প্রসেসিংয়ে সহায়তা করতে পারেন , সম্ভবত সমান্তরাল বিকল্পটি ( --parallel) ব্যবহার করে এবং ফলাফলের সাথে অর্ডারযুক্ত অংশগুলি বাছাই করতে পারেন-m বিকল্পটি ( মার্জ সাজান ) with
এটি করার বিভিন্ন উপায়গুলির মধ্যে একটি এখানে ব্যাখ্যা করা হয়েছে (বিভক্ত ফাইল, একক অংশ অর্ডার করুন, আদেশযুক্ত খণ্ডগুলি একীভূত করুন, টেম্প ফাইলগুলি মুছুন)।

নোট:

  • উইন্ডোজ 10-এ লিনাক্সের জন্য তথাকথিত উইন্ডোজ সাবসিস্টেম উপস্থিত রয়েছে যেখানে সমস্ত লিনাক্স উদাহরণ আরও প্রাকৃতিক বলে মনে হবে।
  • বিভিন্ন অ্যালগরিদমের সাথে বাছাই করার ক্ষেত্রে বিভিন্ন পরিশ্রমের সময়গুলি বিভিন্ন আকারের আকার হিসাবে কাজ করতে পারে এমন ডাটা এন্ট্রিগুলি বাছাই করতে হবে (O (n m ), O (nlogn) ...)।
  • অ্যালগরিদমের দক্ষতা মূল ফাইলটিতে ইতিমধ্যে উপস্থিত ক্রমের উপর নির্ভর করে।
    (উদাহরণস্বরূপ, বুদ্বুদ বাছাই হ'ল ইতিমধ্যে অর্ডার করা ফাইলের জন্য সবচেয়ে দ্রুত অ্যালগরিদম - ঠিক এন - তবে এটি অন্যান্য ক্ষেত্রে দক্ষ নয়)।

2

পিটার এইচ-এর বিকল্প সমাধান দেওয়ার জন্য, একটি প্রোগ্রাম Q রয়েছে যা টেক্সট ফাইলগুলির বিরুদ্ধে এসকিউএল স্টাইল আদেশ দেয় allows এসকিউএল ওয়ার্কবেঞ্চ ইনস্টল বা টেবিল তৈরি না করে নীচের কমান্ডটি একই কাজ করবে (ফাইল হিসাবে একই ডিরেক্টরিতে কমান্ড প্রম্পট থেকে চালানো হবে)।

q "select * from words.txt order by c1"

c1 1 কলামের শর্টহ্যান্ড।

আপনি এর সাথে সদৃশ শব্দ বাদ দিতে পারেন

q "select distinct c1 from words.txt order by c1"

এবং আউটপুটটি অন্য একটি ফাইলে প্রেরণ করুন

q "select distinct c1 from words.txt order by c1" > sorted.txt

এটি কোনও 800 গিগ ফাইলটি মোকাবেলা করবে কিনা তা সম্পর্কে কোনও ধারণা?
রাউলিং

1
আমি 100% নিশ্চিত নই - আমি উপরেরটি 1200 লাইন ফাইল (9 কেবি) দিয়ে পরীক্ষা করেছি। বিকাশকারী পৃষ্ঠাগুলিতে একটি "সীমাবদ্ধতা" পৃষ্ঠা রয়েছে যা সর্বাধিক ফাইলের আকার সম্পর্কে কোনও উল্লেখ করে না। একটি বড় ফাইল এখনও মেমোরি সমস্যার বিরুদ্ধে আসতে পারে।
ব্রায়ান

3
কুই এই পরিমাণ প্রক্রিয়া করতে পারছি না এর ডেটা মনে রাখবেন যে কুই ব্যবহার SQLite দৃশ্য পিছনে যদি আমি লোড করতে পারিনি তথ্য থেকে সরাসরি SQLite কি মনে করে তোলে কুই করতে পারে?
MaYaN

2

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

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

Sorter.serializerTextUtf8()
      .input(inputFile)
      .output(outputFile)
      .loggerStdOut() // display some progress
      .sort();

আমি এলোমেলোভাবে 16 টি অক্ষরের শব্দ তৈরি করে একটি 1.7 গিগাবাইট ফাইল (100 মিটার লাইন) তৈরি করেছি এবং 142 সেকেন্ডে উপরের মতো এটি বাছাই করেছি এবং আমি যে পদ্ধতিটি ব্যবহার করছি তার ও (এন লগ এন) গণনার জটিলতার উপর ভিত্তি করে আমি অনুমান করি যে 16 গিগাবাইট অক্ষরের শব্দের 800 গিগাবাইট হবে এসএসডি সহ আমার i5 2.3GHz ল্যাপটপে একক থ্রেডযুক্ত বাছাই করতে প্রায় 24 ঘন্টা সময় নেয়।

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