जवाबों:
Coreutils 8.6 (2010-10-15) के अनुसार, GNU sortपहले से ही उपलब्ध कई प्रोसेसर का उपयोग करने के लिए समानांतर में सॉर्ट करता है। इसलिए, यह आगे की तरह इस संबंध में सुधार नहीं किया जा सकता pigzया pbzip2में सुधार gzipया bzip2।
यदि आपका sortसमानांतर नहीं है, तो आप GNU कोरुटिलsort के नवीनतम संस्करण से GNU को स्थापित और स्थापित कर सकते हैं ।
GNU सॉर्ट के साथ, आप --parallelविकल्प के साथ थ्रेड्स की संख्या को सीमित कर सकते हैं ।
यदि आपकी फ़ाइल काफी बड़ी है, तो सॉर्टिंग डिस्क स्वैपिंग का कारण बनेगी, या तो क्योंकि आवंटित वर्चुअल मेमोरी बहुत बड़ी हो रही है, या क्योंकि sortप्रोग्राम ही डिस्क और बैक को चंक्स स्वैप कर रहा है। पुराने sortकार्यान्वयन में इस तरह के "डिस्क बफर के माध्यम से" प्रकार के व्यवहार की संभावना होती है, क्योंकि पुराने दिनों में बड़ी फ़ाइलों को सॉर्ट करने का एकमात्र तरीका था।
sortयहां एक -mविकल्प है जो आपकी मदद कर सकता है। फ़ाइल को विखंडू में विभाजित करने के लिए तेज़ हो सकता है - साथ में कहें split -l- उन्हें स्वतंत्र रूप से सॉर्ट करें, फिर उन्हें एक साथ मर्ज करें।
तो फिर, यह हो सकता है कि यह वास्तव में "डिस्क बफर के माध्यम से" क्या करता है। यह पता लगाने का एकमात्र तरीका है कि क्या यह आपके विशेष परीक्षण भार पर बेंचमार्क करने में मदद करता है। महत्वपूर्ण पैरामीटर आपके द्वारा दी जाने वाली लाइन की संख्या होगी split -l।
splitऔर mergeकरें और देखें कि यह मदद करता है।
merge(1)यहां प्रयोज्यता है। का उपयोग करें sort -m।
sort --merge।
मेरे पास बहुत महत्वपूर्ण लाभ था sort -n, जिसके लिए वैज्ञानिक संकेतन के बिना सभी चयनित कॉलमों में संख्यात्मक मान (फ्लोट या पूर्णांक) की आवश्यकता होती है।
एक और संभावना है कि आपकी प्रक्रिया में एक महान सुधार ला सकता है /dev/shmमध्यस्थ फ़ाइलों से निपटने के लिए मेमोरी मैप्ड फ़ोल्डर का उपयोग करना है ।
export LC_COLLATE=C
export LANG=C
cat big_file | sort > /dev/null
सामान्य रूप से लिनक्स सॉर्ट यूनिकोड समानता नियमों का पालन करने के लिए कुछ निफ्टी सामान करता है ... यदि आप लोकेल को सी में बदलते हैं तो यह केवल बाइट में बदल जाता है ...
1.4GB फ़ाइल के लिए मेरी मशीन पर अंतर 20s बनाम 400s (!!!) है
LC_ALL=Cपर्याप्त नहीं होगा ?
LC_COLLATEपहले से ही पर्याप्त है। AFAIK तुलना के लिए sortउपयोग करता strcollहै और मैनपेज कहता है कि व्यवहार निर्भर करता हैLC_COLLATE
#! /bin/sh
#config MAX_LINES_PER_CHUNK based on file length
MAX_LINES_PER_CHUNK=1000
ORIGINAL_FILE=inputfile.txt
SORTED_FILE=outputfile.txt
CHUNK_FILE_PREFIX=$ORIGINAL_FILE.split.
SORTED_CHUNK_FILES=$CHUNK_FILE_PREFIX*.sorted
#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 -n -t , -k 1,1 $file > $file.sorted &
done
wait
#echo "**********SORTED CHUNK FILES*********"
#echo $SORTED_CHUNK_FILES
#Merging chunks to $SORTED_FILE ...
sort -mn $SORTED_CHUNK_FILES > $SORTED_FILE
#Cleanup any lefover files
rm -f $SORTED_CHUNK_FILES > /dev/null
rm -f $CHUNK_FILE_PREFIX* > /dev/null
फ़ाइल को विभाजित किया गया है और इसे सॉर्ट करने की गति बढ़ जाएगी