কেন নাম দিয়ে ফাইলগুলি মুছে ফেলা বেদনাদায়কভাবে ধীর এবং ব্যতিক্রমী দ্রুত?


11

ভুয়া পাস: "দ্রুত" পদ্ধতিটি আমি নীচে উল্লেখ করেছি, ধীরের চেয়ে 60 গুণ দ্রুত নয়। এটি 30 গুণ বেশি দ্রুত। আমি এই সময়ে ভুলটিকে দোষ দেব (3am স্পষ্ট ভাবনার জন্য আমার দিনের সেরা সময় নয় :) ..

আপডেট: আমি পরীক্ষার সময়ের সংক্ষিপ্তসার যোগ করেছি (নীচে)।
স্পিড ফ্যাক্টরের সাথে দুটি বিষয় জড়িত বলে মনে হচ্ছে:

  • ব্যবহৃত কমান্ডের পছন্দ (নীচে প্রদর্শিত সময়ের তুলনা)
  • ডিরেক্টরিতে প্রচুর সংখ্যক ফাইলের প্রকৃতি ... মনে হয় "বড়টি খারাপ"। সংখ্যা বাড়ার সাথে সাথে বিষয়গুলি অপ্রয়োজনীয়ভাবে ধীর হয়ে যায় ..

সমস্ত পরীক্ষা 1 মিলিয়ন ফাইল দিয়ে করা হয়েছে।
(বাস্তব, ব্যবহারকারীর এবং জটিল সময় পরীক্ষা স্ক্রিপ্টে রয়েছে)
পরীক্ষার স্ক্রিপ্টগুলি পেস্ট.বুন্টু.কম এ পাওয়া যাবে

#
# 1 million files           
# ===============
#
#  |time   |new dir   |Files added in  ASCENDING order  
#  +----   +-------   +------------------------------------------------- 
#   real    01m 33s    Add files only (ASCENDING order) ...just for ref.
#   real    02m 04s    Add files, and make 'rm' source (ASCENDING order) 
#                      Add files, and make 'rm' source (DESCENDING order) 
#   real    00m 01s    Count of filenames
#   real    00m 01s    List of filenames, one per line
#   ----    -------    ------
#   real    01m 34s    'rm -rf dir'
#   real    01m 33s    'rm filename' via rm1000filesPerCall   (1000 files per 'rm' call)
#   real    01m 40s    'rm filename' via  ASCENDING algorithm (1000 files per 'rm' call)
#   real    01m 46s    'rm filename' via DESCENDING algorithm (1000 files per 'rm' call)
#   real    21m 14s    'rm -r dir'
#   real    21m 27s    'find  dir -name "hello*" -print0 | xargs -0 -n 1000 rm'
#   real    21m 56s    'find  dir -name "hello*" -delete'
#   real    23m 09s    'find  dir -name "hello*" -print0 | xargs -0 -P 0 rm'
#   real    39m 44s    'rm filename' (one file per rm call) ASCENDING
#   real    47m 26s    'rm filename' (one file per rm call) UNSORTED
#                                                       

আমি সম্প্রতি 10 মিলিয়ন খালি পরীক্ষার ফাইলগুলি তৈরি এবং মুছে ফেলেছি । নামের ভিত্তিতে ফাইলগুলি মুছে ফেলা হচ্ছে (অর্থাত্ rm filename), আমি খুব শক্তভাবে খুঁজে পেয়েছি যে 2 টি বিভিন্ন পদ্ধতির মধ্যে বিশাল সময়ের পার্থক্য আছে ...

উভয় পদ্ধতিই একই rm filenameকমান্ডটি ব্যবহার করে ।

আপডেট: দেখা যাচ্ছে যে কমান্ডগুলি হুবহু একই ছিল না ... তাদের মধ্যে একটি 'rm' তে একবারে 1000 ফাইলের নাম পাঠিয়েছিল ... এটি শেল ব্রেস-এক্সপেনশন সমস্যা ছিল যেখানে আমি ভেবেছিলাম প্রতিটি ফাইলের নাম লেখা হচ্ছে was তার নিজস্ব লাইনে ফিডার ফাইলটিতে, তবে আসলে এটি প্রতি লাইনে 1000 ছিল

ফিল্মের নামগুলি একটি 'ফিডার ফাইল' এর মাধ্যমে একটি while readলুপে সরবরাহ করা হয় ..
ফিডার ফাইলটির আউটপুট ls -1 -f
পদ্ধতিগুলি একটি জিনিস ব্যতীত সমস্ত পুনর্বিবেচনায় একরকম:

  • ধীর পদ্ধতি থেকে সরাসরি পাঁচমিশালী ফিডার ফাইল ব্যবহারls -1 -f
  • ফাস্ট পদ্ধতি যে একই পাঁচমিশালী ফাইলের একটি সাজানো সংস্করণ ব্যবহার করে

আমি নিশ্চিত না যে এখানে বাছাই করা থইস ইস্যু কিনা, বা সম্ভবত যে বাছাই করা ফিডার ফাইলটি সেই ফাইলগুলির ক্রমটি মেলানোর জন্য ঘটেছিল (আমি একটি সাধারণ আরোহী পূর্ণসংখ্যার অ্যালগরিদম ব্যবহার করেছি)

1 মিলিয়ন ফাইলের জন্য, দ্রুত rm filename পদ্ধতিটি ধীর পদ্ধতির চেয়ে 60 গুণ বেশি দ্রুত ... আবার, আমি জানি না এটি কোনও "বাছাই" সমস্যা, বা পর্দার অন্তর্গত হ্যাশ টেবিলের সমস্যা কিনা ... আমার সন্দেহ এটি একটি সহজ বাছাইয়ের সমস্যা নয় কারণ কেন ইচ্ছাকৃতভাবে আমাকে ফাইলনামগুলির একটি সদ্য যুক্ত হওয়া "সাজানো" ক্রমের তালিকাবিহীন তালিকা দেবে ... ls -1 -f

আমি এখানে কী চলছে তা ভাবছি, তাই পরবর্তী 10 মিলিয়ন ফাইল মুছতে আমার কয়েকদিন (হ্যাঁ দিনগুলি) লাগে না :) .... আমি "দিন" বলি কারণ আমি অনেকগুলি বিকল্প চেষ্টা করেছিলাম, এবং জড়িত সংখ্যক ফাইলের সাথে জড়িতদের সংখ্যা বাড়িয়ে তুলুন .. সুতরাং আমি কেবল বিশদে 1 মিলিয়ন পরীক্ষা করেছি

বিটিডাব্লু: নামগুলির "সাজানো তালিকার" মাধ্যমে ফাইলগুলি মুছে ফেলা আসলে rm -rf২ এর ফ্যাক্টরের চেয়ে দ্রুত
এবং rm -rএটি "সাজানো তালিকার" পদ্ধতির চেয়ে 30 গুণ ধীর ছিল

... তবে এখানে কি বিষয়টি "সাজানো" আছে? বা এটি ext4 দ্বারা ব্যবহৃত হ্যাশিং (বা যাই হোক না কেন) স্টোরেজ পদ্ধতির সাথে আরও সম্পর্কিত?

যে বিষয়টি আমাকে বেশ ধাঁধা দেয় তা rm filenameহ'ল প্রতিটি কলটি পূর্বের সাথে সম্পর্কিত নয় .. (ভাল, কমপক্ষে এটি 'বাশ' দৃষ্টিকোণ থেকে এমনভাবে হয়)

আমি উবুন্টু / বাশ / 'এক্সট 4' / সটা II ড্রাইভ ব্যবহার করছি।


1
আপনি এটা ভুল করছেন! (টিএম) কখনও শুনেছেন find -delete?
অ্যালেক্স

আপনার 2 টি পরীক্ষা অসম পরিস্থিতিতে শুরু হয় (আমি এটি প্রকৃতপক্ষে গুরুত্বপূর্ণ তা ভেবে দেখছি না): একটি ফাইল থেকে ফাইলের নাম পড়ে এবং অন্যটি পরীক্ষার ঠিক আগে তৈরি করা (সাজানো) করা ফাইল থেকে ফাইলের নামগুলি পড়ে। এটি হতে পারে যে ২ য় ক্ষেত্রে ক্যাশে হওয়া ফাইলটি কিছু খেলছে (বা সম্ভবত না, কে জানে)। পরীক্ষাগুলি আরও সমান অবস্থায় থাকার জন্য, সম্ভবত দ্বিতীয় টেস্টের আগে cat- প্রথম টেস্টের আগে আপনার একটি নতুন ফাইলের জন্য সহজ করা উচিত sort
ইম্জ - ইভান জ্যাকারিয়াশ্চ শেভ

এবং আমি আপনাকে আপনার পর্যবেক্ষণ এবং আপনার প্রশ্নটি আরও পরিষ্কার ফ্যাশন উপস্থাপন করার পরামর্শ দিচ্ছি। দয়া করে, একবারে একটি জিনিস: একটি প্রশ্নে মাত্র ২ টি কেস তুলনা করুন, দুটি গুরুত্বপূর্ণ কেসকে ভুলে যাওয়া উচিত, অন্য সবগুলি কেবল ব্যাকগ্রাউন্ডের তথ্য; দয়া করে এটি পরিষ্কার করুন। দয়া করে একটি পোস্টে বেশ কয়েকটি পর্যবেক্ষণ মেশান না।
ইম্জ - ইভান জাখারিয়াশ্চ শেভ

ধাঁধা সমাধানের জন্য আপনার থেকে সিস্টেম এবং ব্যবহারকারী-স্থানের সময় উপস্থাপনাও গুরুত্বপূর্ণ হতে পারে, সুতরাং দয়া করে এগুলিকে আপনার প্রশ্নে অন্তর্ভুক্ত করুন। এর মধ্যে কোনটি আপনার পরীক্ষায় বড় পার্থক্য করে?
ইম্জ - ইভান জাখারিয়াশ্চ শেভ

1
অকালীন অপটিমাইজেশন হ'ল সমস্ত অশুভের মূল। :) আপনি কখন 10 মিলিয়ন ফাইল মুছবেন? প্রতি সেকেন্ডে 100 000 আমার কাছে যথেষ্ট দ্রুত বলে মনে হয় (আপনার সিস্টেম নষ্ট করতে)।
ব্যবহারকারী অজানা

উত্তর:


2

rm -r এর পুনরাবৃত্ত হিসাবে ধীর হবে বলে আশা করা হচ্ছে। ডিরেক্টরি কাঠামোয় একটি গভীরতার প্রথম ট্রভারসালাল তৈরি করতে হয়।

এখন আপনি কীভাবে ১০ কোটি ফাইল তৈরি করলেন? আপনি কি কিছু স্ক্রিপ্ট ব্যবহার করেছেন যা কোনও ক্রমে লুপ করে? 1.txt, 2.txt, 3.txt ... যদি হ্যাঁ হয় তবে এই ফাইলগুলিকেও একই আদেশে এইচডিডি তে বিতর্কিত ব্লকগুলিতে বরাদ্দ করা হতে পারে so সুতরাং একই আদেশে মোছা দ্রুত হবে।

"ls -f" -aU সক্ষম করে যা ডিরেক্টরি ক্রমে তালিকাভুক্ত করে যা আবার পুনরাবৃত্ত হয়।


1
ম্যাকআলট: আমি দেখতে পাচ্ছি না যে এই ক্ষেত্রে 'রিকার্সিভ' কীভাবে গুরুত্বপূর্ণ , কারণ এতে কোনও সাব-ডিরেক্টরি জড়িত নেই ... হ্যাঁ আমি "1.txt, 2.txt, 3.txt 'ব্যবহার করেছি। সম্ভবত বেশ কয়েকটি রয়েছে আলাপচারিতার জিনিস: যেমন, কেন এটা লাগবে শুধুমাত্র 1min 30s 1 মিলিয়ন ফাইল তৈরি করতে, কিন্তু এটা 2 মিলিয়ন তৈরি করতে 7 মিটার 10s নেয় এবং সেগুলি মুছে ফেলা হলে, 1 মিলিয়ন recreating পরে। অনেক বেশী সময় লাগে (9m 30s) তার অদ্ভুত; সবকিছু চলছে হঠাৎ করে হঠাৎ করেই .এটি আগেও সুখী হয়েছে .আমি মনে করি (?) ডিরেক্টরিটি মুছে ফেলাটি ঠিক হয়ে গেছে thereএখানে কোনও ফাইল ডিমন জড়িত আছে (নটিলাস; সনাক্ত করা) সম্ভবত? চালিয়ে যেতে হবে ...
পিটার.ও

সাধারণভাবে, ফাইল ডিরেক্টরিগুলি একই ডিরেক্টরিতে প্রচুর সংখ্যক ফাইলের সাথে ডিল করার জন্য অনুকূলিত হয় না। আমি বিশেষত ext4 এর সাথে পরিচিত নই, তবে অন্যান্য ফর্ম্যাটের জন্য ডিরেক্টরিগুলি মুছে ফেলা হবে যখন ফাইলগুলি মুছে ফেলা হয়েছিল। এর অর্থ ডিরেক্টরিতে অপারেশন করার সময় তাদের অবশ্যই এড়িয়ে যেতে হবে। এটি আপনাকে যে আচরণটি দেখছে তা ব্যাখ্যা করবে।
কিথবি

1
আমি 'এখন ধীর' ​​ডিরেক্টরি মুছে ফেলেছি এবং একটি নতুন ডিরেক্টরিতে আলাদা নাম ব্যবহার করেছি। 1 মিলিয়ন ফাইল তৈরির সময় এখন 1 মিলিয়ন 33 সেকেন্ডে (বনাম 9 মি 30 এর মধ্যে যখন ডিরেক্টরিতে "2 মিলিয়ন মুছে ফেলা ফাইল রয়েছে, প্রথম মিলিয়ন নতুন যুক্ত হওয়া 1 মিলিয়ন হিসাবে একই নামযুক্ত) ... আকর্ষণীয়, এবং এটি আপনার "... সাথে অব্যবহৃত" মন্তব্য হিসাবে চিহ্নিত করা হয়েছে ... সেখানে পৌঁছেছে ; এটি অনুধাবন করা শুরু করছে :)
পিটার.ও

@ ফ্রেড.বায়ার আমার খারাপ, আমি প্রকৃত শ্রেণিবিন্যাস জানি না এবং আমার উত্তর অনুমান ছিল। আপনার পরীক্ষাটি আসলে মেটাডেটাটিকে জোর দেয় তবে প্রকৃত ফাইলগুলি খালি ফাইল হওয়ায় তা নয়। এই ধরণের ইস্যুটিকে বেঞ্চমার্ক করার সর্বোত্তম উপায় হ'ল ওয়েব সার্ভারের / var বা ক্যাশে থেকে ফাইল নেওয়া। যাহাই হউক না কেন আপনার পরীক্ষার খুব মজাদার শোনাচ্ছে, আপনি /sample1/1.txt,2.txt মত বিভিন্ন directories..say ... এবং /sample2/1.txt,2.txt দুই তালিকাভুক্ত পদ্ধতি মুছে ফেলার চেষ্টা করে দেখতে পারেন ..
rajaganesh87

@ মিঃ কনফিউজড.এ.লোট ... আপনাকে সহায়তার জন্য ধন্যবাদ আপনার ব্যাখ্যা আমাকে ফাইল সিস্টেম এবং এর কিছু পদ্ধতি সম্পর্কে আরও বুঝতে সাহায্য করেছে ... আমি এখন ভিন্ন গতির সমস্যার কারণ কী ছিল তার একটি যুক্তিসঙ্গত ধারণা পেয়েছি ... কিছু ছিল কেবল বাশ কমান্ডের পছন্দ এবং অন্যটি কেবল ফাইল সিস্টেম সমস্যাগুলি ছিল ( আমি একটি নতুন লক্ষ্য রেখেছি: ডিরেক্টরিগুলির জন্য "বড় খারাপ" ... (কিছু ক্রিয়াকলাপের জন্য, কমপক্ষে) ...
পিটার.ও

2

আপনার ফাইল স্ট্রাস্ট্রাকচারটি অনুকূল করা উচিত। পরিবর্তে তাই

for i in $(seq 1 1000); do touch file.$i; done

স্মার্ট কিছু করার মতো (বাশ ধরে নেওয়া):

function bucklocate() 
{ 
    hash=$(echo -n "$1"|md5sum|cut -f1); 
    echo -n "${hash:1:1}/${hash:7:1}/${hash:9:2}/$1"; 
}

hexdig="{0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f}"
eval mkdir -p $hexdig/$hexdig/$hexdig$hexdig


for i in $(seq 1 1000); do touch $(bucklocate file.$i); done

এমডি 5sum [1] ব্যবহারের কারণে এখন এই উদাহরণটি বরং ধীর হয়ে গেছে, তত দ্রুত প্রতিক্রিয়া জানাতে নীচের মতো কিছু ব্যবহার করুন, যতক্ষণ না আপনার কোনও নির্দিষ্ট ফাইলের নাম প্রয়োজন হয় না, ডুপ্লিকেটগুলি কোনও উদ্বেগের বিষয় নয় এবং কোনও প্রয়োজনের প্রয়োজন নেই একটি নির্দিষ্ট নামের পুনরাবৃত্তিযোগ্য হ্যাশ :)

mkdir -pv {0,1,2,3,4,5,6}/{0,1,2,3,4,5,6,7,8,9,10,12}
for  a in $(seq 1 100); do i=$RANDOM; echo touch "$(($i%7))/$(($i%13))/file.$i"; done

অবশ্যই এটি হ্যাশট্যাবলগুলি থেকে opণ ধারনাগুলি sl


আমি মনে করি আপনি "ছোট ডিরেক্টরি ব্যবহার করুন" বলছেন ... এটি একটি আন্তঃজাতীয় ধারণা; একটি বাড়ির উত্সাহিত ডিবিএমএস যা 'ট্রি-লিস্ট' ফাইলের একটি গ্রুপ থেকে গাছ তৈরি করে "" কেউ কেউ এটিকে সামনের পরিকল্পনা বলে অভিহিত করতে পারে :) ... যদি এটি কাজ করে (এবং এটি সম্ভবত হয়) তবে এটি একটি ভাল ধারণা ! :) ... আমি এই ধারণাটি পাওয়া শুরু করছি যে 'ডিরেক্টরিটি বড়' খারাপ, কারণ এটি কোনও ডিরেক্টরিতে ফাইলের সংখ্যায় আসে (কমপক্ষে ext4 এর জন্য) ... আপনি একটি প্রাকদর্শনীয় কাজের (+1) এবং আমি উপস্থাপন করেছি কিছু মুছে ফেলা পদ্ধতি যে কোনও নির্দিষ্ট ডিরেক্টরিতে অন্যদের চেয়ে দ্রুততর কেন আপনি ধীরে ধীরে একটি ধারণা পেয়ে
যাচ্ছেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.