फ़ाइलों को सुरक्षित करने का सबसे तेज़ तरीका


25

मुझे 20GB से अधिक की कुल 10k + फाइलें मिली हैं जिन्हें मुझे एक फाइल में बदलना है।

से भी तेज रास्ता है

cat input_file* >> out

?

पसंदीदा तरीका बैश कमांड होगा, पाइथन स्वीकार्य है, भले ही वह कितना भी धीमा क्यों न हो।


मेरे उत्तर को अपडेट किया गया, findशेल ग्लोब के समान फ़ाइलों को सॉर्ट नहीं करता है।
ग्रीम

5
किसी भी और सभी (साने) समाधानों के बराबर गति यहां होगी क्योंकि समय 99% सिस्टम I / O होगा।
गोल्डीलॉक्स


3
जिस फ़ाइल को आप पढ़ रहे हैं, उसकी तुलना में एक अलग डिस्क में संक्षिप्त फ़ाइल लिखने पर विचार करना।
लुइस

1
यदि outयह किसी अन्य डिस्क पर स्थित है, तो यह तेज़ हो जाएगा ।

जवाबों:


30

नहींं, बिल्ली निश्चित रूप से ऐसा करने का सबसे अच्छा तरीका है। जब इस उद्देश्य के लिए सी में पहले से ही एक कार्यक्रम लिखा गया है तो अजगर का उपयोग क्यों करें? हालाँकि, यदि आप xargsकमांड लाइन की लंबाई अधिक होने की स्थिति में उपयोग करने पर विचार करना चाहते हैं ARG_MAXऔर आपको एक से अधिक की आवश्यकता है cat। GNU टूल का उपयोग करना, यह आपके पहले से ही के बराबर है:

find . -maxdepth 1 -type f -name 'input_file*' -print0 |
  sort -z |
  xargs -0 cat -- >>out

1
क्या आप इस मामले में बीमा कर सकते हैं कि आपकी फाइलें ऑर्डर में पढ़ी जाएंगी?
कीवी

1
हाँ, क्योंकि के आउटपुट के findमाध्यम से पाइप किया जाता है sort। इसके बिना, फाइलों को एक अनियंत्रित क्रम में सूचीबद्ध किया जाएगा (फाइल सिस्टम द्वारा परिभाषित, जो फ़ाइल निर्माण आदेश हो सकता है)।
scai

@ संसाई मुझे खेद है, सॉर्ट के साथ यह बहुत स्पष्ट है
कीवी

1
@ कीवी, केवल एक ही मामला मैं देख सकता हूं कि अगर वातावरण में ठीक से सेट नहीं है, तो एक bashग्लोब से अलग तरह का व्यवहार हो सकता है । अन्यथा मैं किसी भी मामले हैं, जहां नहीं दिख रहा है xargsया catअपेक्षा के अनुरूप व्यवहार नहीं होता।
ग्रीम

3
@MarcvanLeeuwen, E2BIG को निष्पादित (2) की त्रुटि से बचने के लिए आवश्यक के रूप में xargsकॉल करेगा cat
स्टीफन चेजलस

21

पहले आउटपुट फ़ाइल के लिए स्थान आवंटित करने से समग्र गति में सुधार हो सकता है क्योंकि सिस्टम को हर लेखन के लिए आवंटन को अपडेट नहीं करना होगा।

उदाहरण के लिए, यदि लिनक्स पर:

size=$({ find . -maxdepth 1 -type f -name 'input_file*' -printf '%s+'; echo 0;} | bc)
fallocate -l "$size" out &&
  find . -maxdepth 1 -type f -name 'input_file*' -print0 |
  sort -z | xargs -r0 cat 1<> out

एक और लाभ यह है कि यदि पर्याप्त खाली स्थान नहीं है, तो प्रतिलिपि का प्रयास नहीं किया जाएगा।

यदि पर btrfs, आप copy --reflink=alwaysपहली फ़ाइल (जिसका अर्थ है कि कोई डेटा कॉपी नहीं है और इसलिए यह लगभग तात्कालिक होगा), और बाकी को जोड़ दें। यदि 10000 फाइलें हैं, तो संभवत: तब तक कोई फर्क नहीं पड़ेगा, जब तक कि पहली फाइल बहुत बड़ी न हो।

सभी फ़ाइलों ( BTRFS_IOC_CLONE_RANGE ioctl) को री-कॉपी करने के लिए सामान्य करने के लिए एक एपीआई है , लेकिन मुझे उस एपीआई को उजागर करने में कोई उपयोगिता नहीं मिल रही है, इसलिए आपको इसे सी ( pythonया अन्य भाषाओं में करना होगा, बशर्ते कि वे मनमाने ढंग से कॉल कर सकें ioctl) ।

यदि स्रोत फ़ाइलें विरल हैं या NUL वर्णों के बड़े अनुक्रम हैं, तो आप (GNU सिस्टम पर) के साथ विरल आउटपुट फ़ाइल (समय और डिस्क स्थान की बचत) बना सकते हैं:

find . -maxdepth 1 -type f -name 'input_file*' -print0 |
  sort -z | xargs -r0 cat | cp --sparse=always /dev/stdin out

1
@XTian, ​​नहीं, यह न तो >और न ही होना चाहिए >>, लेकिन 1<>जैसा कि मैंने फ़ाइल में लिखने के लिए कहा था ।
स्टीफन चेज़लस

5
@grebneke, <>मानक बॉर्न / POSIX रीड + राइट रीडायरेक्शन ऑपरेटर है। विवरण के लिए अपना शेल मैनुअल या POSIX कल्पना देखें। डिफ़ॉल्ट fdहै 0के लिए <>ऑपरेटर ( <>के लिए कम है 0<>, की तरह <के लिए कम है 0<और >के लिए कम 1>है ताकि आप की जरूरत है,) 1स्पष्ट रूप से रीडायरेक्ट stdout के लिए। यहां, यह इतना नहीं है कि हमें पढ़ने + लिखने ( O_RDWR) की आवश्यकता है, लेकिन हम O_TRUNC(जैसा >) नहीं चाहते हैं कि जो हमने अभी आवंटित किया है, उसे निपटा देगा।
स्टीफन चेजलस

1
@grebneke, unix.stackexchange.com/search?q=user%3A22565+%22%3C%3E%22 आपको कुछ देगा। ksh93 ने ऑपरेटरों को BTW की तलाश की है, और आप ddपढ़ने के साथ या इसके माध्यम से आगे की तलाश कर सकते हैं ।
स्टीफन चेजलस

1
@ स्टेफ़ेनचेज़लस - बहुत बहुत धन्यवाद, आपकी मदद और ज्ञान की गहराई से सराहना की गई है!
grebneke

1
मुझे यकीन नहीं है कि ऐसे कई मामले fallocateहोंगे जहां अतिरिक्त के ओवरहेड को नकार दिया जाएगा find, भले ही यह दूसरे समय के दौर में तेजी से हो। btrfsहालांकि कुछ दिलचस्प संभावनाएं खुलती हैं।
ग्रीम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.