2011-02-16 7 views
24

में 10 मिलियन फ़ाइलों को संग्रहीत और एक्सेस करना मैं एक ऐप लिख रहा हूं जिसमें लगभग 10 मिलियन तक की कई फाइलों को स्टोर करने की आवश्यकता है।लिनक्स

वर्तमान में उन्हें यूयूआईडी के साथ नामित किया गया है और वे प्रत्येक 4 एमबी के आसपास होने जा रहे हैं लेकिन हमेशा एक ही आकार के होते हैं। इन फ़ाइलों से/पढ़ने और लिखना हमेशा अनुक्रमिक होगा।

2 मुख्य सवाल है मैं के लिए जवाब की तलाश कर रहा हूँ:

1) कौन सा फाइल सिस्टम इसके लिए सबसे अच्छा होगा। एक्सएफएस या ext4? 2) क्या एक निर्देशिका में फ़ाइलों की संख्या को कम करने के लिए उपनिर्देशिका के नीचे फ़ाइलों को स्टोर करना आवश्यक होगा?

प्रश्न 2 के लिए, मुझे लगता है कि लोगों ने एक ही निर्देशिका में संग्रहीत फ़ाइलों की संख्या के लिए XFS सीमा को खोजने का प्रयास किया है और लाखों से अधिक की सीमा नहीं मिली है। उन्होंने कोई प्रदर्शन समस्या नहीं देखी। Ext4 के तहत क्या?

इसी तरह की चीजों को करने वाले लोगों के साथ घूमते हुए, कुछ लोगों ने प्रदर्शन के लिए फ़ाइल नाम के बजाय फ़ाइल के लिंक के रूप में इनोड नंबर को संग्रहीत करने का सुझाव दिया (यह एक डेटाबेस इंडेक्स में है जिसे मैं भी उपयोग कर रहा हूं)। हालांकि, मुझे इनोड नंबर द्वारा फ़ाइल खोलने के लिए उपयोग करने योग्य API नहीं दिखाई देता है। ऐसा लगता है कि ext3 के तहत प्रदर्शन में सुधार के लिए एक सुझाव है जो मैं रास्ते में उपयोग करने का इरादा नहीं रख रहा हूं।

ext4 और XFS सीमाएं क्या हैं? एक दूसरे से क्या प्रदर्शन लाभ हैं और क्या आप मेरे मामले में एक्सएफएस पर ext4 का उपयोग करने का कारण देख सकते हैं?

+1

उदा। देखें http://lwn.net/Articles/400629/ – nos

उत्तर

17

आपको निश्चित रूप से उपनिर्देशिका में फ़ाइलों को स्टोर करना चाहिए।

ext4 और XFS दोनों फ़ाइल नाम के लिए कुशल देखने तरीकों का उपयोग, लेकिन अगर तुम कभी निर्देशिका ऐसे ls या find के रूप में आप बहुत 1000 की प्रबंधनीय मात्रा में फ़ाइलें करने में खुशी होगी से अधिक उपकरणों को चलाने के लिए की जरूरत है - 10,000 फ़ाइलें।

इनोड संख्या संख्या EXT फाइल सिस्टम के अनुक्रमिक पहुंच प्रदर्शन को बेहतर बनाने के लिए है। मेटाडेटा इनोड्स में संग्रहीत होता है और यदि आप इन इनोड्स को ऑर्डर से बाहर करते हैं तो मेटाडाटा एक्सेस यादृच्छिक होते हैं। इनोड ऑर्डर में अपनी फाइलें पढ़कर आप मेटाडाटा एक्सेस अनुक्रमिक भी बनाते हैं।

+0

इनोड नंबर चीज़ के साथ, मैं इनोड द्वारा फ़ाइल कैसे खोलूं? मैं फिर एक महंगी स्टेट ऑपरेशन का उपयोग करने से बच सकता हूं? – Matt

+4

@ मैट इनोड द्वारा फ़ाइल खोलने का कोई तरीका नहीं है (यह यूनिक्स एक्सेस कंट्रोल स्कीम का हिस्सा बाईपास करेगा)।लेकिन 'readdir' आपको इनोड नंबर बताता है, इसलिए आप फ़ाइल नामों की अपनी सूची को इनोड नंबर से सॉर्ट करते हैं और उन्हें उस क्रम में खोलते हैं। बीटीडब्लू, "' स्टेट 'महंगा है "एक ओवरम्प्लिफिकेशन है; अधिक सटीक कथन "' stat (f) है; खुला (एफ) '" h = open (f); fstat (h) '" से कुछ हद तक महंगा है। (महंगी ऑपरेशन जिसे आप बाद में दो बार करने से बचते हैं मामला * पथनाम प्रसंस्करण * है, डिस्क का उपयोग नहीं। अंतर 2x होता था लेकिन आधुनिक प्रणालियों के साथ बहुत कम होना चाहिए।) – zwol

+0

@Zack - बहुत उपयोगी अंतर्दृष्टि के लिए धन्यवाद स्टेट/खुली बनाम खुली/fstat – Matt

8

आधुनिक फाइल सिस्टम आपको पसंद होने पर एक ही निर्देशिका में 10 मिलियन फ़ाइलों को स्टोर करने देगा। लेकिन उपकरण (एलएस और उसके दोस्त) अच्छी तरह से काम नहीं करेंगे।

मैं एक स्तर की निर्देशिका, एक निश्चित संख्या, शायद 1,000 निर्देशिकाएं डालने और वहां फ़ाइलों को डालने की सिफारिश करता हूं (10,000 फाइलें खोल के लिए सहनशील है, और "एलएस")।

मैंने सिस्टम को देखा है जो निर्देशिकाओं के कई स्तर बनाते हैं, यह वास्तव में अनावश्यक है और इनोड खपत में वृद्धि करता है और ट्रैवर्सल धीमा बनाता है।

10 एम फ़ाइलों को वास्तव में कोई समस्या नहीं होनी चाहिए, जब तक कि आपको उन पर थोक संचालन करने की आवश्यकता न हो।

मुझे उम्मीद है कि आपको पुरानी फाइलों को छीनने की आवश्यकता होगी, लेकिन "tmpwatch" जैसे कुछ शायद 10 एम फाइलों के साथ ठीक काम करेंगे।

+0

धन्यवाद, धन्यवाद mkdir है एक धीमी ऑपरेशन? क्या मुझे स्टार्टअप पर निर्देशिकाओं को पूर्व-बनाना चाहिए और फिर से मान लें कि वे मौजूद हैं? – Matt

+0

निर्देशिकाओं के बारे में अच्छा विचार। यह पतला है आप सही हैं। – Matt

+0

एक बार जब आप एक ही निर्देशिका में लाखों फाइलों में शामिल हो जाते हैं, ext4' संघर्ष करना शुरू कर देता है और इंडेक्स हैश टकराव प्राप्त करता है। – steve