मेरे पास एक 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
?