जवाबों:
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
फ़ाइल को विभाजित किया गया है और इसे सॉर्ट करने की गति बढ़ जाएगी