ইউএনআইএক্স sort
কমান্ড একটি খুব বড় ফাইল এর মতো বাছাই করতে পারে:
sort large_file
সাজানো অ্যালগরিদম কীভাবে প্রয়োগ করা হয়?
কীভাবে এটি অতিরিক্ত স্মৃতিশক্তি গ্রহণ করে না?
ইউএনআইএক্স sort
কমান্ড একটি খুব বড় ফাইল এর মতো বাছাই করতে পারে:
sort large_file
সাজানো অ্যালগরিদম কীভাবে প্রয়োগ করা হয়?
কীভাবে এটি অতিরিক্ত স্মৃতিশক্তি গ্রহণ করে না?
উত্তর:
ইউনিক্স সাজান কমান্ডের আলগোরিদিমজাত বিবরণ ইউনিক্স সাজান একটি বহিস্থিত আর-ওয়ে একত্রীকরণ বাছাই আলগোরিদিম ব্যবহার করে বলল। লিঙ্কটি আরও বিশদে চলে যায় তবে সংক্ষেপে এটি ইনপুটটিকে ছোট ছোট ভাগে ভাগ করে দেয় (যা মেমরির সাথে খাপ খায়) এবং তারপরে প্রতিটি অংশ একসাথে একত্রিত করে।
সতর্কতা: এই স্ক্রিপ্টটি প্রতি অংশে একটি শেল শুরু করে, সত্যিই বড় ফাইলগুলির জন্য, এটি শত শত হতে পারে।
এই উদ্দেশ্যে আমি একটি স্ক্রিপ্ট লিখেছিলাম। একটি 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
আরও দেখুন: " বড় ফাইলগুলি শেল স্ক্রিপ্টের সাথে দ্রুত বাছাই করা "
আমি প্রোগ্রামটির সাথে পরিচিত নই তবে আমার ধারণা এটি বাহ্যিক বাছাইয়ের মাধ্যমে সম্পন্ন হয়েছে (সমস্যার বেশিরভাগটি অস্থায়ী ফাইলগুলিতে ধারণ করা হয় যখন সমস্যাটির অপেক্ষাকৃত ছোট অংশটি একটি সময়ে স্মৃতিতে রাখা হয়)। ডোনাল্ড নথের কম্পিউটার প্রোগ্রামিংয়ের আর্ট অফ দেখুন , খণ্ড। 3 বাছাই করা এবং সন্ধান করা, বিষয়টির গভীর-আলোচনার জন্য বিভাগ 5.4 ।
#!/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
পারফরম্যান্সের গতি বাছাইয়ের ধরণের বিকল্পগুলি মনোযোগ সহকারে দেখুন এবং এটি আপনার মেশিন এবং সমস্যার উপর প্রভাব ফেলবে understand উবুন্টুতে মূল পরামিতিগুলি
প্রশ্নকারী জিজ্ঞাসা করে "কেন উচ্চ মেমরির ব্যবহার নেই?" এর উত্তর ইতিহাস থেকে আসে, পুরানো ইউনিক্স মেশিনগুলি ছোট ছিল এবং ডিফল্ট মেমরির আকার ছোট সেট করা হয়েছিল। আপনার কাজের চাপের জন্য বাছাইয়ের পারফরম্যান্সের ব্যাপকতর উন্নতি করতে এটি যথাসম্ভব যথাযথভাবে সামঞ্জস্য করুন। আপনার দ্রুততম ডিভাইসে এমন একটি স্থানে কার্যনির্বাহী ডিরেক্টরি সেট করুন যা কমপক্ষে 1.25 * ফাইলের আকার বাছাই করার জন্য পর্যাপ্ত জায়গা রয়েছে।
স্মৃতি কোনও সমস্যা হওয়া উচিত নয় - বাছাই করা ইতিমধ্যে এটির যত্ন নেয়। আপনি যদি নিজের মাল্টি-কোর সিপিইউর সর্বোত্তম ব্যবহার করতে চান তবে আমি এটি একটি ছোট স্ক্রিপ্টে প্রয়োগ করেছি (কিছুটা যেমন আপনি নেট এ খুঁজে পেতে পারেন তবে এর বেশিরভাগের চেয়ে সহজ / ক্লিনার;))।
#!/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*