1000000 छोटी फ़ाइलों को कॉपी करने की गति


11

मेरे पास एक dir में 1000000 4-20 kb फाइलें हैं। मुझे उस डायर की नकल करने की आवश्यकता है। लेकिन ऐसा लगता है कि मुझे प्रत्येक फाइल के लिए एक तलाश करनी है इसलिए इसमें काफी समय लगता है।

क्या कोई ऐसा तरीका है जिसमें मैं इसे गति दे सकता हूं?

मैं वर्तमान में सोच रहा हूं कि अगर मुझे डिस्क ब्लॉक मिल सकते हैं जो इन फाइलों पर कब्जा कर लेते हैं, तो मैं उन को सॉर्ट कर सकता हूं, उन ब्लॉकों को मर्ज कर सकता हूं जो करीब थे (यह देखते हुए कि अनुक्रमिक रीड अक्सर मांगने से तेज है) और इन ब्लॉकों को पढ़ें, ताकि वे रैम में थे कॉपी करने से पहले कैश (मेरे पास 32 जीबी रैम है)।

लेकिन उस काम के लिए मुझे यह पहचानने का एक तरीका चाहिए जो फाइलों को ब्लॉक करता है।

मैं एक चुंबकीय उपकरण (यानी एसएसडी नहीं) पर EXT4 का उपयोग कर रहा हूं।

संपादित करें:

यह काम करना चाहिए लेकिन यह नहीं है:

ls |
parallel -IOO --pipe "sudo parallel -j100 hdparm --fibmap {}'|tail -n +5'" |
sort -nk 2 | 
perl -ane 'if($u+10000 < $F[1]) { print "$l ",($u-$l),"\n"; $l=$F[1] } $u=$F[2]' |
sudo parallel --colsep ' ' dd if=/dev/sda1 skip={1} bs=512 count={2} '| cat >/dev/null'

जब इसे किसी बड़ी फाइल पर टेस्ट करते हैं तो यह फाइल को कैश नहीं करता है।

EDIT2:

यहाँ कुछ बेंचमार्क हैं। echo 3 >/proc/sys/vm/drop_cachesप्रत्येक रन के बीच कैश फ्लश किया गया था । के साथ किए गए माप iostats -dkx 5

rsync -Hav foo/ bar/: 1800 KB/s
cp -a foo/ bar/: 3600 KB/s
cat sort-by-inode | parallel -j1 -X cp foo/{} bar/: 5000 KB/s
cat sort-by-inode | shuf | parallel -j1 -X cp foo/{} bar/: 3000 KB/s
cat sort-by-inode | shuf | parallel -j10 -X cp foo/{} bar/: 7000 KB/s
cat sort-by-inode | parallel -j10 -X cp foo/{} bar/: 8000 KB/s
cat sort-by-inode | parallel -j100 -X cp foo/{} bar/: 9000 KB/s
cat sort-by-inode | parallel -j500 -X cp foo/{} bar/: 10000 KB/s

तो हम इससे क्या सीख सकते हैं?

ऐसा लगता है कि इनकोड द्वारा छांटना एक अच्छा विचार है। लेकिन यह cpआगे भी कई प्रदर्शनों को बढ़ाता है। यह ध्यान देने योग्य है कि स्रोत foo/एक चुंबकीय डिस्क है, इसलिए यह मिथक पर हमला करता है कि I / O को एक स्पिंडल के समानांतर करना I / O को गति नहीं देगा: यहां स्पष्ट रूप से समानांतर और लगातार नकल को गति देगा।


क्या आपकी निर्देशिका में केवल फ़ाइलें हैं? क्या आपका लक्ष्य स्थान एक ही फाइल सिस्टम पर है?
जोसेफ आर।

सटीक कमांड के लिए आप कॉपी करने के लिए उपयोग कर रहे हैं? कुछ पसंद है cp -r /mnt/dir1 /mnt/dirdestया कुछ पसंद है cp /mnt/dir1/* /mnt/dirdest?
मैक्सक्लेपज़िग

केवल फाइलें लेकिन समान फाइलसिस्टम नहीं: cp -r / mnt / dir1 / mnt2 / dirdest
Ole Tange

btw, मुझे नहीं लगता कि यह मदद करता है यदि आप हार्ड डिस्क एक्सेस को समानांतर में निष्पादित करते हैं, जब आप डिस्क सीकों को कम से कम करना चाहते हैं।
मैक्सक्लेपजिग

मैंने एक प्रोग्राम लिखा है जो उनकी सीमा संख्या (डिस्क पर घटना होने की संभावना) द्वारा फाइलों को आदेशित करता
nh2

जवाबों:


9

ऐसा मानते हुए

  • द्वारा लौटाई गई प्रविष्टियों readdirको इनकोड संख्या द्वारा क्रमबद्ध नहीं किया गया है
  • इनकोड क्रम में फाइलें पढ़ने से ऑपरेशन की संख्या कम हो जाती है
  • अधिकांश फ़ाइलों की सामग्री प्रारंभिक 8k आवंटन (एक ext4 अनुकूलन) में होती है, जिसमें कम शोध कार्यों का भी उत्पादन होना चाहिए

आप इनकोड क्रम में फ़ाइलों की प्रतिलिपि बनाकर प्रतिलिपि बनाने की कोशिश कर सकते हैं।

इसका मतलब है कि इस तरह से कुछ का उपयोग करना:

$ cd /mnt/src
$ ls -U -i | sort -k1,1 -n | cut -d' ' -f2- > ~/clist
$ xargs cp -t /mnt2/dst < ~/clist

@ माइकर्स, आपका क्या मतलब है? ls -Uपर्याप्त नहीं है क्योंकि यह इनकोड संख्याओं के अनुसार नहीं है ... और मुझे क्यों चाहिए -1?
मैक्सक्लेपज़िग

@mikeserv, 'डायरेक्टरी ऑर्डर में' इनोड ऑर्डर के समान नहीं है! अगर ऐसा होगा तो आपको इसके लिए अलग शब्द का इस्तेमाल नहीं करना पड़ेगा। जो आपको अजीब लगता है वह प्रासंगिक नहीं है। मैं भी एक ext4 फाइल सिस्टम पर यह परीक्षण किया है। और वहाँ निर्देशिका आदेश वास्तव में इनोड आदेश से अलग है। -1बस 'प्रति पंक्ति एक फ़ाइल' को सूचीबद्ध करता है - यह फ़ाइल नाम में नई सूचियों के साथ मदद नहीं करता है। उसके लिए आप उपयोग कर सकते हैं find -print0/xargs -O
मैक्सक्लेपजिग

@mikeserv, आप किस बारे में बात कर रहे हैं? काउंटर उदाहरण: mkdir tmp; cd tmp; touch foo"<RETURN>"bar; lsप्रिंट 'फू? बार'। A ls -1भी 'foo? Bar' प्रिंट करता है। एक ls -1 | wc -lप्रिंट '2'। एक find -lsफ़ाइल नाम को'//oooo\nbar 'प्रिंट करता है। एक cp -i ls -1` x '' cp: लक्ष्य 'x' के साथ विफल रहता है एक निर्देशिका नहीं है।
मैक्सचेलपिजिग

लानत - तुम मुझे छोड़ दिया और सही सिखा रहे हैं! -qमुझे लगता है कि क्या -1होगा! फिर से, मेरी माफी - धन्यवाद का उल्लेख नहीं करना।
मिकसरर्व

4

GNU tar- paxपरंपरा में - हार्डलिंक्स को अपने आप संभालता है।

cd "$srcdir" ; tar --hard-dereference -cf - ./* |
    tar -C"${tgtdir}" -vxf -

इस तरह से आपके पास केवल दो tarप्रक्रियाएँ हैं और आपको cpबार-बार निवेश करते रहने की आवश्यकता नहीं है ।


2

@ Maxschlepzig के उत्तर के समान नस पर , आप filefragफाइलों को क्रम में क्रमबद्ध करने के लिए पार्स कर सकते हैं ताकि डिस्क पर उनके पहले टुकड़े दिखाई दें:

find . -maxdepth 1 -type f |
  xargs -d'\n' filefrag -v |
  sed -n '
    /^   0:        0../ {
      s/^.\{28\}\([0-9][0-9]*\).*/\1/
      h
      }
    / found$/ {
      s/:[^:]*$//
      H
      g
      s/\n/ /p
      }' |
    sort -nk 1,1 |
    cut -d' ' -f 2- |
    cpio -p dest_dir

उपरोक्त sedस्क्रिप्ट के साथ MMV , इसलिए पूरी तरह से परीक्षण करना सुनिश्चित करें।

अन्यथा, आप जो कुछ भी करते हैं, filefrag( e2fsprogsउसका कुछ हिस्सा ) का उपयोग करने की तुलना hdparmमें बहुत तेज़ होगा क्योंकि यह कई फ़ाइल तर्क ले सकता है। बस hdparm1,000,000 बार चलने वाले ओवरहेड में बहुत अधिक ओवरहेड जुड़ने वाले हैं।

इसके अलावा perl, FIEMAP ioctlप्रत्येक फ़ाइल के लिए स्क्रिप्ट (या C प्रोग्राम) लिखना शायद इतना मुश्किल नहीं होगा, उन ब्लॉकों की एक क्रमबद्ध सरणी बनाएं जिन्हें कॉपी किया जाना चाहिए और फाइलों को संबंधित और फिर क्रम से सब कुछ कॉपी करना होगा संबंधित फ़ाइल से प्रत्येक ब्लॉक का आकार पढ़ना (सावधान रहें, हालांकि फाइल डिस्क्रिप्टर से बाहर नहीं निकलना है)।


यह अच्छा है, एक पेपर के लिए home.ifi.uio.no/paalh/publications/files/ipccc09.pdf भी देखें जो दृष्टिकोण का वर्णन करता है और tarउनकी फ़ाइलों के लिए ~ 4x स्पीडअप दिखाता है ।
nh2

1
मैंने कागज के लेखकों को ईमेल किया है, यह पूछते हुए कि क्या वे qtarखुले स्रोत के रूप में जारी कर सकते हैं ; अब यह github.com/chlunde/qtar पर है
nh2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.