1000000 ছোট ফাইল অনুলিপি করুন


11

আমার কাছে একটি ডাইরে 1000000 4-20 কেবি ফাইল রয়েছে। আমার সেই দির কপি করা দরকার তবে মনে হচ্ছে প্রতিটি ফাইলের জন্য আমাকে সন্ধান করতে হবে তাই এটি বেশ খানিকটা সময় নেয়।

এমন কোনও উপায় আছে যেখানে আমি এই গতি বাড়িয়ে তুলতে পারি?

আমি বর্তমানে ভাবছি যে এই ফাইলগুলি যে ডিস্ক ব্লকগুলি ধারণ করে আমি যদি সেগুলি পেতে পারি তবে আমি সেগুলিকে বাছাই করতে পারি, যেগুলি ব্লকগুলি নিকটে ছিল তা সংহত করতে পারি (এই অনুক্রমিক পাঠটি প্রায়শই চাওয়ার চেয়ে দ্রুত হয়) এবং এই ব্লকগুলি পড়তে পারি, যাতে সেগুলি র‌্যামে ছিল কপিটি করার আগে ক্যাশে (আমার কাছে 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?
ম্যাক্সচলেপজিগ

কেবল ফাইলগুলি কিন্তু একই ফাইল সিস্টেম নয়: সিপি -আর / এমএনটি / ডির 1 / এমএনটি 2 / ডারডেস্ট
ওলে

বিটিডব্লিউ, আমি মনে করি না যে আপনি যখন ডিস্ক সিক্সকে ছোট করতে চান তখন আপনি যদি সমান্তরালে হার্ড ডিস্ক অ্যাক্সেসগুলি কার্যকর করেন তবে এটি সাহায্য করে।
ম্যাক্সচলেপজিগ

আমি একটি প্রোগ্রাম লিখেছি যা ফাইলগুলি তাদের পরিধি সংখ্যার (ডিস্কে সংঘটিত হওয়ার সম্ভাবনা বেশি) আদেশ করে: github.com/nh2/diskorder
nh2

উত্তর:


9

ধরে নিচ্ছি যে

  • প্রবেশ করা এন্ট্রিগুলি readdirইনোড নম্বর অনুসারে বাছাই করা হয় না
  • ইনোড ক্রমে ফাইলগুলি পড়া সন্ধানের ক্রিয়াকলাপকে হ্রাস করে
  • বেশিরভাগ ফাইলের বিষয়বস্তু প্রাথমিক 8k বরাদ্দে থাকে (একটি এক্সট 4 অপ্টিমাইজেশন) যা কম সন্ধান অপারেশনও অর্জন করতে পারে

আপনি ইনোড ক্রমে ফাইলগুলি অনুলিপি করে অনুলিপি করার চেষ্টা করতে পারেন।

এর অর্থ এইরকম কিছু ব্যবহার করা:

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

@ মাইকজার্ভ, আপনার মানে কী? ls -Uএটি যথেষ্ট নয় কারণ এটি ইনোড সংখ্যা অনুসারে বাছাই করে না ... এবং আমার কেন চাইবে -1?
ম্যাক্সচলেপজিগ

@ মাইক্রোসার্ভ, 'ডিরেক্টরি ক্রমে' ইনোড অর্ডারের মতো নয়! যদি এটি হয় তবে আপনাকে এটির জন্য আলাদা শব্দ ব্যবহার করতে হবে না। আপনি যা অদ্ভুত মনে করেন তা প্রাসঙ্গিক নয়। এমনকি আমি এটি একটি এক্সট 4 ফাইল সিস্টেমেও পরীক্ষা করেছি। এবং সেখানে ডিরেক্টরি অর্ডার আসলে ইনোড ক্রম থেকে পৃথক। -1কেবল 'প্রতি লাইনে একটি ফাইল' তালিকাবদ্ধ করে - এটি ফাইলের নামগুলিতে নতুন লাইনে সহায়তা করে না। তার জন্য আপনি ব্যবহার করতে পারেন find -print0/xargs -O
ম্যাক্সচলেপজিগ

@ মাইকজার্, আপনি কী সম্পর্কে কথা বলছেন? পাল্টা উদাহরণ: mkdir tmp; cd tmp; touch foo"<RETURN>"bar; ls'ফু? বার' প্রিন্ট করুন। একজন ls -1এছাড়াও প্রিন্ট 'foo বিন্যাস? দণ্ড'। একটি ls -1 | wc -lপ্রিন্ট '2'। একটি find -lsফাইলের নাম './foo\nbar' হিসাবে মুদ্রণ করে। cp -i 'সিপি: টার্গেট' এক্স 'দিয়ে একটি এলএস -1` x a ব্যর্থ হয় ডিরেক্টরি নয়'।
ম্যাক্সচলেপজিগ

জঘন্য - আপনি আমাকে বাম এবং ডান পড়াচ্ছেন! -qআমি যা ভেবেছিলাম -1তা করে! আবার, আমার ক্ষমাপ্রার্থী - ধন্যবাদ উল্লেখ না।
মাইক্রজারভ

4

GNU tar- paxtraditionতিহ্যে - নিজেরাই হার্ডলিঙ্কগুলি পরিচালনা করে।

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

এইভাবে আপনার কাছে কেবল দুটি tarপ্রক্রিয়া রয়েছে এবং আপনার cpবারবার অনুরোধ করা লাগবে না ।


2

@ ম্যাক্সচলেপজিগ এর উত্তরের অনুরূপ শিরাতে , আপনি 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স্ক্রিপ্ট সহ এমএমভি , সুতরাং পুরোপুরি পরীক্ষা করতে ভুলবেন না।

অন্যথায়, আপনি যা-ই করুন না কেন, filefrag(এর অংশ e2fsprogs) ব্যবহার করা আরও দ্রুত হবে hdparmকারণ এটি একাধিক ফাইল আর্গুমেন্ট নিতে পারে। hdparm1,000,000 বার দৌড়াতে কেবল ওভারহেড প্রচুর ওভারহেড যুক্ত করতে চলেছে।

এছাড়াও প্রতিটি ফাইলের জন্য perlএকটিতে স্ক্রিপ্ট (বা সি প্রোগ্রাম) লেখার পক্ষে এতটা অসুবিধা হবে না FIEMAP ioctlযে অনুলিপি করা উচিত এমন ব্লকগুলির একটি বাছাই করা অ্যারে তৈরি করুন এবং যে ফাইলগুলির অন্তর্ভুক্ত রয়েছে এবং তারপরে সমস্ত কিছু অনুলিপি করতে হবে সংশ্লিষ্ট ফাইল থেকে প্রতিটি ব্লকের আকার পড়া (যদিও ফাইলের বর্ণনাকারীর বাইরে চলে না যাওয়ার বিষয়ে সতর্কতা অবলম্বন করুন)।


এটি দুর্দান্ত, এছাড়াও একটি পেপারের জন্য home.ifi.uio.no/paalh/publications/files/ipccc09.pdf দেখুন যা তাদের ফাইলগুলির জন্য একটি x 4x স্পিডআপ দেখায় tar
এনএইচ 2

1
আমি কাগজের লেখকদের ইমেল করে জিজ্ঞাসা করেছি যে তারা qtarমুক্ত উত্স হিসাবে প্রকাশ করতে পারে কিনা ; এটি এখন github.com/chlunde/qtar
nh2
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.