গিট .git / অবজেক্টস / ফোল্ডারটি কেন অনেক SHA- উপসর্গ ফোল্ডারগুলিতে বিভক্ত?


21

গিট অভ্যন্তরীণভাবে .git/objects/ফোল্ডারে আইটেমগুলি (ব্লবস, ট্রি) সঞ্চয় করে । প্রতিটি বস্তু একটি SHA1 হ্যাশ দ্বারা রেফারেন্স করা যেতে পারে যা বস্তুর বিষয়বস্তু থেকে গণনা করা হয়।

তবে অবজেক্টগুলি .git/objects/সরাসরি ফোল্ডারের ভিতরে সংরক্ষণ করা হয় না । পরিবর্তে, প্রতিটি বস্তু একটি ফোল্ডারের ভিতরে সঞ্চিত থাকে যা তার SHA1 হ্যাশের উপসর্গ দিয়ে শুরু হয়। সুতরাং হ্যাশ সহ একটি বস্তু b7e23ec29af22b0b4e41da31e868d57226121c84সংরক্ষণ করা হবে.git/objects/b7/e23ec29af22b0b4e41da31e868d57226121c84

কেন গিট তার অবজেক্ট স্টোরেজকে এভাবে উপ-বিভাগ করবে?

আমি যে সংস্থানগুলি খুঁজে পেতে পারি, যেমন গিট-স্কেমে গিটের অভ্যন্তরীণ পৃষ্ঠাগুলি কেবল তা কীভাবে হয় তা ব্যাখ্যা করে

উত্তর:


33

সমস্ত ফাইল একটি ডিরেক্টরিতে রাখা সম্ভব, যদিও কখনও কখনও এটি কিছুটা বড় হয়ে যায়। অনেক ফাইল সিস্টেমের একটি সীমা থাকে । আপনি একটি ইউএসবি স্টিকের একটি FAT32 ফর্ম্যাট ড্রাইভে একটি গিট সংগ্রহস্থল রাখতে চান? আপনি কেবল একটি ডিরেক্টরিতে 65,535 টি ফাইল সঞ্চয় করতে পারেন। এর অর্থ হ'ল ডিরেক্টরি কাঠামোকে উপ-বিভাজন করা প্রয়োজন যাতে একক ডিরেক্টরি পূরণের সম্ভাবনা কম।

এটি অন্যান্য ফাইল সিস্টেম এবং বৃহত্তর গিট সংগ্রহস্থলগুলির ক্ষেত্রেও সমস্যা হয়ে উঠবে। অপেক্ষাকৃত ছোট গিট রেপো যা আমি হ্যাঙ্গআউট হয়েছি (প্রায় 360MiB) এবং এতে 11k ফাইলের জন্য 181,546 টি অবজেক্ট রয়েছে। লিনাক্স রেপো টানুন এবং আপনার কাছে 4,374,054 টি অবজেক্ট রয়েছে। যদি আপনি এই সমস্তগুলি একটি ডিরেক্টরিতে রাখেন তবে ফাইল সিস্টেম পরীক্ষা করা অসম্ভব এবং ক্রাশ হয়ে যাবে ('ক্র্যাশ' এর কিছু অর্থের জন্য) ফাইল সিস্টেমটি।

তাই? আপনি এটি বাইট দ্বারা বিভক্ত। ফায়ারফক্সের মতো অ্যাপ্লিকেশনগুলির সাথে অনুরূপ পন্থা করা হয়:

~/Li/Ca/Fi/Pr/7a/Cache $ ls
0/           4/           8/           C/           _CACHE_001_
1/           5/           9/           D/           _CACHE_002_
2/           6/           A/           E/           _CACHE_003_
3/           7/           B/           F/           _CACHE_MAP_

এর বাইরেও এটি কার্য সম্পাদনের প্রশ্নে যায়। অসংখ্য দীর্ঘ ফাইলের নাম সহ এনটিএফএসের পারফরম্যান্স বিবেচনা করুন :

উইন্ডোজ এনটি উইন্ডোজ এনটি ফাইল সিস্টেমের (এনটিএফএস) ফর্ম্যাট ড্রাইভগুলির ডিরেক্টরি ক্রিয়াকলাপ করতে দীর্ঘ সময় নেয় যা একটি একক ডিরেক্টরিতে দীর্ঘ ফাইলের নাম (8.3 কনভেনশন অনুসারে নাম নয়) সহ প্রচুর ফাইল থাকে files

এনটিএফএস যখন একটি ডিরেক্টরিতে ফাইলগুলি গণনা করে, এটি দীর্ঘ ফাইলের নামের সাথে যুক্ত 8.3 টি নাম সন্ধান করতে হবে। একটি এনটিএফএস ডিরেক্টরি একটি বাছাই করা অবস্থায় সংরক্ষণ করা হয়, লং ফাইলের নাম এবং 8.3 নাম সাধারণত ডিরেক্টরি তালিকার একে অপরের পাশে থাকে না। সুতরাং, এনটিএফএস উপস্থিত প্রতিটি ফাইলের জন্য ডিরেক্টরিটির রৈখিক অনুসন্ধান ব্যবহার করে। ফলস্বরূপ, ডিরেক্টরিতে ফাইল সংখ্যার বর্গক্ষেত্রের সাথে ডিরেক্টরি তালিকা সঞ্চালনের জন্য প্রয়োজনীয় সময়ের পরিমাণ বৃদ্ধি পায়। সংখ্যক ফাইলের জন্য (কয়েক শতাধিকেরও কম) সময়ের বিলম্ব নগণ্য। কিন্তু ডিরেক্টরিতে ফাইলের সংখ্যা কয়েক হাজারে বেড়ে যাওয়ার সাথে সাথে তালিকা সম্পাদনের জন্য প্রয়োজনীয় সময়টি কয়েক মিনিট, ঘন্টা বা এমনকি কয়েক দিন পর্যন্ত বাড়তে পারে। দীর্ঘ ফাইলের নামগুলি খুব একই রকম হয় - কেবলমাত্র কয়েকটি শেষ অক্ষরে ভিন্ন ering

SHA1 চেকসামের নামযুক্ত ফাইলগুলির সাথে, এটি বিপর্যয় এবং অস্বাভাবিক কার্যকারিতার রেসিপি হতে পারে।

(এবং এনটিএফএস 1.2 - সাধারণভাবে 1995 প্রথম দিকে 2000 হত) যদিও উপরে উইন্ডোজ এনটি 3.5 থেকে একটি কারিগরি নোট থেকে এই যেমন জিনিষ দেখা যায় দ্বারা EXT3 সঙ্গে ফাইলসিস্টেম লিঙ্ক তালিকা হচ্ছে বাস্তবায়নের প্রয়োজন হে (ঢ) লুকআপ । এমনকি বি-ট্রি পরিবর্তনের সাথেও:

যদিও এইচটি্রি অ্যালগরিদম লুকের সময়গুলিতে উল্লেখযোগ্যভাবে উন্নতি করেছে, এটি ওয়ার্ক লোডগুলির জন্য কিছু কার্য সম্পাদনের জন্য চাপ সৃষ্টি করতে পারে যা একটি বিশাল ডিরেক্টরিতে সমস্ত ফাইলের কিছু অপারেশন করতে readdir () ব্যবহার করে।
...
ড্যানিয়েল ফিলিপস এবং আন্দ্রেস ডিলগার দ্বারা প্রস্তাবিত এই পারফরম্যান্স ইস্যুটি প্রশমিত করার একটি সম্ভাব্য সমাধান, তবে এখনও বাস্তবায়িত হয়নি, এর মধ্যে কর্নেলটি ফ্রি ইনোডগুলি বেছে নিচ্ছে যার ইনোড সংখ্যা এমন একটি সম্পত্তির সাথে মিলবে যা তাদের ফাইলের নাম হ্যাশ দ্বারা ইনোডগুলিকে ভাগ করে দেয়। ড্যানিয়েল এবং আন্দ্রেস ডিরেক্টরি আকারের উপর ভিত্তি করে বিভিন্ন ইনোড থেকে ইনোড বরাদ্দ করার পরামর্শ দেয় এবং তারপরে ফাইলের নাম হ্যাশের উপর ভিত্তি করে সেই পরিসর থেকে একটি নিখরচায় ইনড বেছে নেওয়ার পরামর্শ দেয়। এটি তত্ত্বগতভাবে ডিরেক্টরিটিতে রেডডির অর্ডারে রেফারেন্সড ইনোডগুলি অ্যাক্সেস করার সময় ফলাফল ছিটানোর পরিমাণ হ্রাস করতে হবে। এতে এটি স্পষ্ট নয় যে এই কৌশলটির ফলে দ্রুতগতির ফলাফল হবে; প্রকৃতপক্ষে এটি সামগ্রিকভাবে ইনোড ব্লকের সংখ্যা বাড়িয়ে তুলতে পারে যা রেফারেন্স করতে হতে পারে, এবং এভাবে রিডডির () + স্ট্যাট () কাজের চাপকে আরও খারাপ করতে পারে। পরিষ্কারভাবে,

ঘটনাচক্রে, পারফরম্যান্সের উন্নতি করার জন্য এই বিটটি ২০০৫ সাল থেকে একই বছর গিটটি প্রকাশ করা হয়েছিল।

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


1
আপনি খেয়াল করেছেন যে এনটিএফএসের পারফরম্যান্স নিবন্ধটি আপনি উদ্ধৃত করেছেন এনটিএফ 3.5 এর জন্য প্রযোজ্য, 1994 প্রকাশিত, তাই না?
আভনার শাহর-কাশতান

1
@ আভনারশাহার-কাশতান হাঁ গিট 2005 সালে প্রকাশিত হয়েছিল I আমি জানি যে আমি কর্পোরেট পরিবেশে এনটিএফএস ভি 1.2 ভিত্তিক ফাইল সিস্টেমগুলি 2000 এর দশকের গোড়ার দিকে (তবুও একটি প্রযুক্তি প্রতিষ্ঠানে) ব্যবহার করছি। গিটের প্রয়োজনীয়তা এবং সেই সময়ে সাধারণভাবে উপলব্ধ সিস্টেমে ফাইল সিস্টেমের মধ্যে অবশ্যই ওভারল্যাপ রয়েছে।

সম্ভবত এটি আরও পরিষ্কার হবে যদি আপনি বলেছিলেন যে গিট চালু হওয়ার সময় এটি প্রযুক্তি রাষ্ট্রের historicalতিহাসিক নিদর্শন হতে পারে, কারণ এটি যেমন দাঁড়িয়েছে, 2015 সালে জিজ্ঞাসা করা এক প্রশ্নের জন্য, বিশ বছরের পুরানো প্রযুক্তিগত সীমাবদ্ধতার উদ্ধৃতি দিয়ে (উত্তরটি গ্রহণ করা বন্ধ করে দেওয়া হয়েছে) ) বিভ্রান্ত মনে হচ্ছে।
অব্নার শাহর-কাশতান

ন্যায়বিচারের জন্য, gitএর "প্যাক" সিস্টেমটি এই সমস্যাগুলিকে অনেকটা প্রশমিত করে। তাত্ত্বিকভাবে, gitকেবলমাত্র একটি একক ডিরেক্টরি ব্যবহার করা হতে পারে এবং সেই ডিরেক্টরিতে ফাইলের সংখ্যা একটি নির্দিষ্ট (সম্ভবত এফএস-নির্ভর) সীমা অতিক্রম করলে কেবল পুনরায় পোস্ট করা সম্ভব।
nneonneo

5
@ অ্যাভনারশাহার-কাশতান লিঙ্কযুক্ত এসও নিবন্ধটি পড়লে আপনি দেখতে পাবেন যে কেবলমাত্র এনটি 3.5 নয়, একাধিক ফাইল সিস্টেম এবং অপারেটিং সিস্টেমে প্রচুর সংখ্যক ফাইল যুক্ত ডিরেক্টরিগুলি নিয়ে কাজ করা সমস্যাযুক্ত। ফাইল সীমা একপাশে রেখে দেওয়া, এমনকি কেবল ফাইলগুলির তালিকা তৈরি করাও প্রচুর পরিমাণে ওভারহেড বহন করতে পারে।

8

এটি পছন্দসই হওয়ার দুটি কারণ রয়েছে।

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

ডিরেক্টরিগুলি রৈখিকভাবে স্ক্যান করা হয়। কিছু ফাইল সিস্টেমে (যেমন এক্সট * পরিবার) একটি ডিরেক্টরি হল একটি লিঙ্কযুক্ত তালিকা বা প্রবেশের টেবিল। কোনও ফাইল সন্ধান করতে, কোনও মিল পাওয়া ফাইলের নাম না পাওয়া পর্যন্ত পুরো তালিকাটি স্ক্যান করা হয়। স্পষ্টতই, এটি পারফরম্যান্সের জন্য অনাকাঙ্ক্ষিত। অনেক আধুনিক ফাইল সিস্টেমগুলি দ্রুত অনুসন্ধানের জন্য হ্যাশ টেবিল বা বি-ট্রি ব্যবহার করে তবে প্রত্যেকেরই এটির নাও থাকতে পারে। প্রতিটি ডিরেক্টরি ছোট রাখার অর্থ দ্রুত অ্যাক্সেসের সময়।


1
"কিছু (যুক্তিসঙ্গতভাবে আধুনিক!) ফাইল সিস্টেমগুলি একটি ডিরেক্টরিতে 32000 এন্ট্রি সীমাবদ্ধ।" যদি গিটটি সবচেয়ে কঠোর সীমাবদ্ধতাটি পূরণ করছে, তবে গিটের পক্ষে হ্যাশের প্রথম দুটি অক্ষর প্রথম দুটি ব্যবহার না করে করানো ভাল কি না ? এর অর্থ হ'ল ডিরেক্টরিটি 256 সীমাবদ্ধ না হয়ে উপরের প্রয়োজনটি পূরণের পরিবর্তে 4096 টি সাব-ডাইরেক্টরি ধরে রাখতে পারে, তবে অতিরিক্ত সুবিধার সাথে those সাব-ডিরেক্টরিগুলি নিজেরাই> 32000 ফাইল সমাপ্ত হওয়ার 16x কম হবে। objects
সাম্পাব্লুকুপার

1

এই 256 বালতি গিটকে ফাইল সিস্টেমে বৃহত্তর সংগ্রহস্থল সংরক্ষণের অনুমতি দেয় যা একটি ডিরেক্টরিতে ফাইল সংখ্যা সীমাবদ্ধ করে এবং অনেকগুলি ফাইল ধারণকারী ডিরেক্টরিতে ধীর হয়ে যায় এমন ফাইল সিস্টেমে বংশদ্ভুত কর্মক্ষমতা সরবরাহ করে।


1

কিছু ফাইল সিস্টেম এবং / অথবা ফাইল-সিস্টেম বাস্তবায়ন এবং / অথবা libc বাস্তবায়ন রয়েছে যেখানে কর্মক্ষমতা বিপুল সংখ্যক ডিরেক্টরি এন্ট্রি সহ অবনমিত হয়।

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