UNIX বাছাই কমান্ড কিভাবে একটি খুব বড় ফাইল বাছাই করতে পারে?


104

ইউএনআইএক্স sortকমান্ড একটি খুব বড় ফাইল এর মতো বাছাই করতে পারে:

sort large_file

সাজানো অ্যালগরিদম কীভাবে প্রয়োগ করা হয়?

কীভাবে এটি অতিরিক্ত স্মৃতিশক্তি গ্রহণ করে না?


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

আসলে, আপনি যদি ডিস্কে কোনও ফাইল বাছাই না করে বরং পাইপ ব্যবহার করেন তবে এটি ইয়াজ আরও আকর্ষণীয় যেহেতু এটি স্পষ্ট করে তোলে যে আপনি কেবল ইনপুট ডেটাতে একাধিক পাস করতে পারবেন না।
tvanfosson

3
এসও-তে প্রত্যেকে কেন সারাক্ষণ অনুমান করতে অনুপ্রাণিত হয়?

আপনি ইনপুটটিতে একাধিক পাস করতে পারেন - আপনাকে কেবল সমস্ত ইনপুট পড়তে হবে, এটি ডিস্কে লিখতে হবে এবং তারপরে ডিস্ক ফাইলটি বাছাই করতে হবে।

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

উত্তর:


111

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



12

সতর্কতা: এই স্ক্রিপ্টটি প্রতি অংশে একটি শেল শুরু করে, সত্যিই বড় ফাইলগুলির জন্য, এটি শত শত হতে পারে।


এই উদ্দেশ্যে আমি একটি স্ক্রিপ্ট লিখেছিলাম। একটি 4 প্রসেসর মেশিনে এটি বাছাইয়ের পারফরম্যান্সকে 100% দ্বারা উন্নত করেছে!

#! /bin/ksh

MAX_LINES_PER_CHUNK=1000000
ORIGINAL_FILE=$1
SORTED_FILE=$2
CHUNK_FILE_PREFIX=$ORIGINAL_FILE.split.
SORTED_CHUNK_FILES=$CHUNK_FILE_PREFIX*.sorted

usage ()
{
     echo Parallel sort
     echo usage: psort file1 file2
     echo Sorts text file file1 and stores the output in file2
     echo Note: file1 will be split in chunks up to $MAX_LINES_PER_CHUNK lines
     echo  and each chunk will be sorted in parallel
}

# test if we have two arguments on the command line
if [ $# != 2 ]
then
    usage
    exit
fi

#Cleanup any lefover files
rm -f $SORTED_CHUNK_FILES > /dev/null
rm -f $CHUNK_FILE_PREFIX* > /dev/null
rm -f $SORTED_FILE

#Splitting $ORIGINAL_FILE into chunks ...
split -l $MAX_LINES_PER_CHUNK $ORIGINAL_FILE $CHUNK_FILE_PREFIX

for file in $CHUNK_FILE_PREFIX*
do
    sort $file > $file.sorted &
done
wait

#Merging chunks to $SORTED_FILE ...
sort -m $SORTED_CHUNK_FILES > $SORTED_FILE

#Cleanup any lefover files
rm -f $SORTED_CHUNK_FILES > /dev/null
rm -f $CHUNK_FILE_PREFIX* > /dev/null

আরও দেখুন: " বড় ফাইলগুলি শেল স্ক্রিপ্টের সাথে দ্রুত বাছাই করা "


35
আপনি কেবল GNU বাছাই করা সংস্করণ 8.11 হিসাবে ধরণের - সমান্তরাল এন ব্যবহার করতে পারেন
jhclark

5
জিএনইউ
কোর্টিলস

1
এই আমার জন্য কৌশলটি করেছে। আমি 8.4 সংস্করণ সাজান। সরাসরি ফাইলটিতে বাছাই করা (১৯০ মিলিয়ন লাইন) কোন দিকে যাচ্ছে না। এই প্রোগ্রামটি মাত্র 4 মিনিটের নিচে এটি করেছে
সুনীল বি

আবার, এই প্রশ্নের প্রশ্নের
কোনও মিল নেই

2
এই লিপিটি বিপজ্জনক। আমার লিনাক্স মেশিনটি কয়েকশত বাছাই প্রক্রিয়া চালু করার পরে প্রতিক্রিয়া হারিয়েছে ...
ইয়ংওয়ে উউ

11

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


11
#!/bin/bash

usage ()
{
    echo Parallel sort
    echo usage: psort file1 file2
    echo Sorts text file file1 and stores the output in file2
}

# test if we have two arguments on the command line
if [ $# != 2 ]
then
    usage
    exit
fi

pv $1 | parallel --pipe --files sort -S512M | parallel -Xj1 sort -S1024M -m {} ';' rm {} > $2

এটি দুর্দান্ত। একটি সমান্তরাল প্যাকেজ ছিল যে সচেতন ছিল না! উপরের ব্যবহারের পরে বাছাইয়ের সময় 50% এরও বেশি উন্নত হয়েছিল। ধন্যবাদ।
xbsd

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

7

পারফরম্যান্সের গতি বাছাইয়ের ধরণের বিকল্পগুলি মনোযোগ সহকারে দেখুন এবং এটি আপনার মেশিন এবং সমস্যার উপর প্রভাব ফেলবে understand উবুন্টুতে মূল পরামিতিগুলি

  • অস্থায়ী ফাইলগুলির অবস্থান -T ডিরেক্টরি_নাম
  • ব্যবহারের জন্য মেমরির পরিমাণ -SN% (সমস্ত মেমরির N% ব্যবহার করার জন্য, তত ভাল তবে সাবস্ক্রিপশনটি এড়িয়ে চলুন যার ফলে ডিস্কে অদলবদল ঘটে। বা 2 জিবি র‌্যামের জন্য "-S 2G")

প্রশ্নকারী জিজ্ঞাসা করে "কেন উচ্চ মেমরির ব্যবহার নেই?" এর উত্তর ইতিহাস থেকে আসে, পুরানো ইউনিক্স মেশিনগুলি ছোট ছিল এবং ডিফল্ট মেমরির আকার ছোট সেট করা হয়েছিল। আপনার কাজের চাপের জন্য বাছাইয়ের পারফরম্যান্সের ব্যাপকতর উন্নতি করতে এটি যথাসম্ভব যথাযথভাবে সামঞ্জস্য করুন। আপনার দ্রুততম ডিভাইসে এমন একটি স্থানে কার্যনির্বাহী ডিরেক্টরি সেট করুন যা কমপক্ষে 1.25 * ফাইলের আকার বাছাই করার জন্য পর্যাপ্ত জায়গা রয়েছে।


এটি একটি 2.5 গিগাবাইট ফাইলে চেষ্টা করে, GB৪ জিবি র‌্যামের একটি বাক্সে -৩০% এসএস এর সাথে, পুরো ফাইলটি এর চেয়ে ছোট হলেও সেক্ষেত্রে এটি পুরো শতাংশটি ব্যবহার করছে। এটা কেন? এমনকি যদি এটি কোনও জায়গার মতো সাজানোর ব্যবহার না করে যা অনুগ্রহজনক বলে মনে হয়
জোসেফ গারভিন

সম্ভবত বাছাই -S ফাইলের বিষয়বস্তু পড়ার আগে বাছাই প্রক্রিয়াটির জন্য মেমরিটিকে প্রাক-বরাদ্দ করে।
ফ্রেড গ্যানেট

-3

স্মৃতি কোনও সমস্যা হওয়া উচিত নয় - বাছাই করা ইতিমধ্যে এটির যত্ন নেয়। আপনি যদি নিজের মাল্টি-কোর সিপিইউর সর্বোত্তম ব্যবহার করতে চান তবে আমি এটি একটি ছোট স্ক্রিপ্টে প্রয়োগ করেছি (কিছুটা যেমন আপনি নেট এ খুঁজে পেতে পারেন তবে এর বেশিরভাগের চেয়ে সহজ / ক্লিনার;))।

#!/bin/bash
# Usage: psort filename <chunksize> <threads>
# In this example a the file largefile is split into chunks of 20 MB.
# The part are sorted in 4 simultaneous threads before getting merged.
# 
# psort largefile.txt 20m 4    
#
# by h.p.
split -b $2 $1 $1.part
suffix=sorttemp.`date +%s`
nthreads=$3
i=0
for fname in `ls *$1.part*`
do
    let i++
    sort $fname > $fname.$suffix &
    mres=$(($i % $nthreads))
    test "$mres" -eq 0 && wait
done
wait
sort -m *.$suffix 
rm $1.part*

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

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