2008-09-22 11 views
22

एक उत्पाद जिसे मैं काम कर रहा हूं, दिन में कई हज़ार रीडिंग एकत्र करता है और उन्हें एनटीएफएस विभाजन (विंडोज एक्सपी) पर 64k बाइनरी फाइलों के रूप में स्टोर करता है। उत्पादन में एक साल बाद एक निर्देशिका में 300000 से अधिक फाइलें हैं और संख्या बढ़ती जा रही है। इसने विंडोज एक्सप्लोरर से माता-पिता/पूर्वजों की निर्देशिकाओं को बहुत समय लेने वाले लोगों तक पहुंचा दिया है।आप बहुत सी छोटी फाइलों से कैसे निपटते हैं?

मैंने इंडेक्सिंग सेवा को बंद करने का प्रयास किया है लेकिन इससे कोई फर्क नहीं पड़ता। मैंने फ़ाइल सामग्री को डेटाबेस/ज़िप फ़ाइलों/टैरबॉल में स्थानांतरित करने पर भी विचार किया है, लेकिन यह व्यक्तिगत रूप से फ़ाइलों तक पहुंचने के लिए फायदेमंद है; मूल रूप से, अनुसंधान प्रयोजनों के लिए फ़ाइलों की अभी भी आवश्यकता है और शोधकर्ता किसी और चीज़ से निपटने के लिए तैयार नहीं हैं।

क्या NTFS या Windows को अनुकूलित करने का कोई तरीका है ताकि यह इन सभी छोटी फ़ाइलों के साथ काम कर सके?

+2

[NTFS प्रदर्शन और बड़ी फ़ाइलों और निर्देशिका की मात्रा] (http://stackoverflow.com/q/197162/365102) –

उत्तर

25

एनटीएफएस प्रदर्शन निर्देशिका में 10,000 फ़ाइलों के बाद गंभीर रूप से घटता है। आप जो करते हैं वह निर्देशिका पदानुक्रम में एक अतिरिक्त स्तर बनाता है, प्रत्येक उपनिर्देशिका में 10,000 फाइलें होती हैं।

इसके लायक होने के लिए, यह दृष्टिकोण है कि एसवीएन लोगों ने version 1.5 में लिया। उन्होंने 1,000 फ़ाइलों को डिफ़ॉल्ट थ्रेसहोल्ड के रूप में उपयोग किया।

+0

मैं जानता हूँ कि बहुत से लोगों को इस दृष्टिकोण की सिफारिश की है, लेकिन मैं इस उत्तर को इसलिए चुना क्योंकि यह हवाला देते एक प्रतिष्ठित सॉफ्टवेयर परियोजना। प्रतिसाद के लिए धन्यवाद। –

+8

क्या आपके पास एक लिंक है जो बताती है कि प्रदर्शन 10,000 फाइलों के बाद क्यों खराब हो रहा है? –

+1

एनटीएफएस के साथ, आप उपफोल्डर्स बनाने की आवश्यकता से पहले लाखों फाइलों को संभाल सकते हैं http://stackoverflow.com/a/291292/141172 –

4

यदि आप फ़ाइलों के नामों की गणना कर सकते हैं, तो आप उन्हें तिथि तक फ़ोल्डरों में सॉर्ट करने में सक्षम हो सकते हैं, ताकि प्रत्येक फ़ोल्डर में केवल एक विशेष तारीख के लिए फ़ाइलें हों। आप महीने और साल पदानुक्रम बनाना भी चाह सकते हैं।

इसके अलावा, क्या आप एक वर्ष, एक साल से अलग (लेकिन अभी भी सुलभ) स्थान पर पुरानी फ़ाइलों को स्थानांतरित कर सकते हैं?

अंत में, और फिर, आपको नामों की गणना करने में सक्षम होने की आवश्यकता है, आप पाएंगे कि फ़ाइल को सीधे एक्सेस करना एक्सप्लोरर के माध्यम से इसे खोलने की कोशिश करने से कहीं अधिक तेज़ है। उदाहरण के लिए, कह
notepad.exe "पी: \ एथलीट \ अपने \ filen.ame को \" कमांड लाइन से
वास्तव में बहुत जल्दी होना चाहिए, यह सोचते हैं आप फ़ाइल का रास्ता आप बिना जरूरत पता एक निर्देशिका लिस्टिंग प्राप्त करें।

0

उन्हें किसी अन्य सर्वर पर धक्का देने पर विचार करें जो बड़ी मात्रा में छोटी फ़ाइलों (उदाहरण के लिए सोलारिस डब्ल्यू/जेएफएस) के लिए एक फाइल सिस्टम का उपयोग करता है?

5

मैंने अतीत में फ़ाइलों को एक नेस्टेड पदानुक्रम में फ़ाइलों को विभाजित करने से पहले बड़े पैमाने पर सुधार देखा है, उदाहरण के लिए, पहले फ़ाइल नाम का दूसरा अक्षर; तो प्रत्येक निर्देशिका में अत्यधिक संख्या में फाइलें नहीं होती हैं। हालांकि, पूरे डेटाबेस में हेरफेर करना अभी भी धीमा है।

2

एक आम चाल केवल कुछ उपनिर्देशिकाएं बनाने और फ़ाइलों को विभाजित करने के लिए है।

उदाहरण के लिए, एक स्वचालित कोड प्रलेखन प्रोग्राम जो डॉक्सिजन, कई HTML पृष्ठों का उत्पादन कर सकता है, में दो-स्तर की गहरी निर्देशिका पदानुक्रम बनाने का विकल्प होता है। फ़ाइलों को तब नीचे निर्देशिकाओं में समान रूप से वितरित किया जाता है।

2
उप-निर्देशिका में फ़ाइलों को रखने से

एक तरफ ..

व्यक्तिगत रूप से, मैं एक आवेदन है कि उस यानी सभी फाइलों को अलग-अलग फ़ाइलों होने के रूप में प्रदर्शित किए जाते हैं एक ही फ़ोल्डर में, इंटरफ़ेस रहता विकसित नहीं करेगी। फिर एप्लिकेशन पृष्ठभूमि में वास्तव में इन फ़ाइलों को ले जाता है और उन्हें एक बड़ी फाइलों में जोड़ता है (और चूंकि आकार हमेशा आपके लिए आवश्यक डेटा प्राप्त करने के लिए 64k होते हैं, तो अपेक्षाकृत आसान होना चाहिए) आपके पास गड़बड़ी से छुटकारा पाने के लिए।

तो आप अभी भी उनके लिए इच्छित फ़ाइलों तक पहुंचने में आसान बना सकते हैं, लेकिन यह भी आपको अधिक नियंत्रण देता है कि सब कुछ कैसे संरचित किया जाता है।

2

आप सॉलिड फाइल सिस्टम जैसे कुछ का उपयोग करने का प्रयास कर सकते हैं।

यह आपको एक आभासी फ़ाइल सिस्टम देता है जो अनुप्रयोगों को माउंट कर सकता है जैसे कि यह एक भौतिक डिस्क थी। आपका एप्लिकेशन बहुत सी छोटी फाइलें देखता है, लेकिन आपकी हार्ड ड्राइव पर केवल एक फ़ाइल बैठती है। एक निर्देशिका वृक्ष में

http://www.eldos.com/solfsdrv/

1

आप कर सकते थे अगर कोई सार्थक, स्पष्ट, डेटा के पहलू हैं घोंसला उन्हें। मेरा मानना ​​है कि मंदी एक निर्देशिका में फाइलों की संख्या के कारण है, न कि फ़ाइलों की संख्या की संख्या।

सबसे स्पष्ट, सामान्य समूह तिथि तक है, और आपको प्रत्येक पत्ती निर्देशिका (1-3k) में फ़ाइलों की संख्या पर अपेक्षाकृत सुरक्षित बाध्यता के साथ तीन-स्तरीय घोंसले की संरचना (वर्ष, महीना, दिन) देता है।

भले ही आप फाइल सिस्टम/फ़ाइल ब्राउज़र प्रदर्शन में सुधार करने में सक्षम हैं, ऐसा लगता है कि यह एक समस्या है जिसे आप 2 साल या 3 साल में चलाएंगे ... बस 0.3-1 मिली फाइलों की सूची देखें लागत लगने जा रहा है, इसलिए फाइलों के छोटे सबसेट को देखने के तरीके खोजने के लिए लंबी अवधि में बेहतर हो सकता है।

'ढूंढें' (साइगविन, या मिंगव के तहत) जैसे टूल का उपयोग उपनिर्देशिका पेड़ की उपस्थिति फ़ाइलों को ब्राउज़ करते समय एक गैर-समस्या की उपस्थिति कर सकता है।

8

प्रदर्शन समस्या एक निर्देशिका में बड़ी मात्रा में फ़ाइलों के कारण होती जा रही है: एक बार जब आप इसे खत्म कर देते हैं, तो आपको ठीक होना चाहिए। यह एनटीएफएस-विशिष्ट समस्या नहीं है: असल में, यह आम तौर पर बड़े यूनिक्स सिस्टम पर उपयोगकर्ता होम/मेल फ़ाइलों के साथ सामना करना पड़ता है।

इस समस्या को हल करने का एक स्पष्ट तरीका फ़ाइल फ़ाइलों के आधार पर फ़ाइलों को फ़ोल्डर्स में ले जा रहा है। मान लें कि आपकी सभी फाइलों में समान लंबाई के फ़ाइल नाम हैं, उदा। ABCDEFGHI.db, ABCEFGHIJ.db, आदि, इस तरह एक निर्देशिका संरचना बनाने के लिए: इस संरचना का उपयोग करना

ABC\ 
    DEF\ 
     ABCDEFGHI.db 
    EFG\ 
     ABCEFGHIJ.db 

, आप जल्दी से अपने नाम के आधार पर एक फ़ाइल को ढूँढ सकते हैं। यदि फ़ाइल नामों में परिवर्तनीय लंबाई है, तो फ़ाइल की निर्देशिका को निर्धारित करने के लिए अधिकतम लंबाई चुनें, और शून्य (या कोई अन्य वर्ण) प्रीपेड करें।

+1

निर्देशिका नामों में रिवर्स स्प्लिट का उपयोग करना बेहतर है - यह समान नाम उपसर्ग को समाप्त करके अंतिम निर्देशिका के अंदर खोज समय में सुधार करेगा, उदाहरण: GHI \ DEF \ ABCDEFGHI.db – ursa

1

प्रत्येक दिन फ़ोल्डर को टाइम स्टैंप के साथ नाम बदलें।

यदि एप्लिकेशन सी: \ रीडिंग में फ़ाइलों को सहेज रहा है, तो मध्यरात्रि में रीडिंग का नाम बदलने और एक नया खाली फ़ोल्डर बनाने के लिए एक निर्धारित कार्य सेट अप करें।

फिर आपको प्रत्येक दिन एक फ़ोल्डर मिलेगा, प्रत्येक में कई हजार फाइलें होंगी।

आप महीने के अनुसार समूह को आगे बढ़ा सकते हैं। उदाहरण के लिए, सी: \ पढ़ना सी बन गया: \ पुरालेख \ सितंबर \ 22।

आपको यह सुनिश्चित करने के लिए अपने समय से सावधान रहना होगा कि आप उस फ़ोल्डर का नाम बदलने की कोशिश नहीं कर रहे हैं जबकि उत्पाद इसे सहेज रहा है।

3

एक निर्देशिका में सैकड़ों हजारों फाइलें वास्तव में एनटीएफएस को अपंग कर देगी, और इसके बारे में आप वास्तव में इतना कुछ नहीं कर सकते हैं। आपको डेटा को एक और अधिक व्यावहारिक प्रारूप में संग्रहीत करना चाहिए, जैसे कि एक बड़ी टैरबॉल या डेटाबेस में।

यदि आपको वास्तव में प्रत्येक पढ़ने के लिए एक अलग फ़ाइल की आवश्यकता है, तो आपको उन्हें एक ही निर्देशिका में रखने के बजाय उन्हें कई उप निर्देशिकाओं में सॉर्ट करना चाहिए। आप निर्देशिकाओं का पदानुक्रम बनाकर और फ़ाइल नाम के आधार पर फ़ाइलों को अलग-अलग में डालकर ऐसा कर सकते हैं। इस तरह आप अभी भी फ़ाइल नाम जानने के लिए अपनी फाइलों को स्टोर और लोड कर सकते हैं।

हम जिस विधि का उपयोग करते हैं वह फ़ाइल नाम के अंतिम कुछ अक्षर लेना, उन्हें उलटाना और उस से एक पत्र निर्देशिका बनाना है। उदाहरण के लिए निम्न फ़ाइलों पर विचार करें:

1.xml 
24.xml 
12331.xml 
2304252.xml 

तुम इतनी तरह निर्देशिकाओं में उन्हें सॉर्ट कर सकते हैं:

data/1.xml 
data/24.xml 
data/1/3/3/12331.xml 
data/2/5/2/4/0/2304252.xml 

यह योजना सुनिश्चित होगा कि आप प्रत्येक निर्देशिका में 100 से अधिक फ़ाइलें है कभी नहीं होगा।

2

मैंने इस समस्या को अतीत में कई बार चलाया है। हमने तिथि के अनुसार संग्रहीत करने की कोशिश की, तिथि से नीचे फ़ाइलों को ज़िपित करने के लिए, इसलिए आपके पास बहुत सी छोटी फाइलें नहीं हैं, आदि। उनमें से सभी डेटा को संग्रहीत करने की वास्तविक समस्या के लिए एनटीएफएस पर बहुत छोटी फाइलों के रूप में बंडिड्स थे।

आप जेएफएस या कुछ अन्य फाइल सिस्टम पर जा सकते हैं जो छोटी फ़ाइलों को बेहतर तरीके से संभालते हैं, लेकिन फिर भी रुकें और पूछें कि क्या आपको छोटी फाइलों को स्टोर करने की आवश्यकता है या नहीं।

हमारे मामले में हम अंततः एक प्रणाली में गए थे, एक निश्चित तारीख के लिए सभी छोटी फाइलों को एक टीएआर प्रकार के फैशन में जोड़ा गया था, जिससे सरल डिलीमीटर उन्हें पार्स कर सकते थे। डिस्क फाइलें 1.2 मिलियन से कुछ हज़ार से कम हो गईं। वे वास्तव में तेजी से लोड हो गए क्योंकि NTFS छोटी फ़ाइलों को बहुत अच्छी तरह से संभाल नहीं सकता है, और ड्राइव 1 एमबी फ़ाइल को कैश करने में सक्षम था। हमारे मामले में फ़ाइल के सही हिस्से को खोजने के लिए पहुंच और पार्स समय संग्रहित फ़ाइलों के वास्तविक संग्रहण और रखरखाव की तुलना में न्यूनतम था।

27

एनटीएफएस वास्तव में एक निर्देशिका में 10,000 से अधिक फ़ाइलों के साथ ठीक प्रदर्शन करेगा जब तक कि आप 16 बिट विंडोज प्लेटफॉर्म के साथ वैकल्पिक फ़ाइल नामों को संगत बनाने के लिए कहें। डिफ़ॉल्ट रूप से NTFS स्वचालित रूप से बनाई गई प्रत्येक फ़ाइल के लिए '8 डॉट 3' फ़ाइल नाम बनाता है। यह एक समस्या बन जाती है जब निर्देशिका में कई फाइलें होती हैं क्योंकि Windows यह सुनिश्चित करने के लिए निर्देशिका में फ़ाइलों को देखता है कि वे जो नाम बना रहे हैं वह पहले से उपयोग में नहीं है। आप NtfsDisable8dot3NameCreation रजिस्ट्री मान को 1 पर सेट करके '8 डॉट 3' नामकरण अक्षम कर सकते हैं। मान HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ FileSystem रजिस्ट्री पथ में पाया जाता है। इस बदलाव को '8 डॉट 3' नाम फाइलों के रूप में सुरक्षित करना सुरक्षित है, केवल विंडोज के बहुत पुराने संस्करणों के लिए लिखे गए प्रोग्रामों द्वारा आवश्यक है।

इस सेटिंग प्रभावी होने से पहले एक रीबूट की आवश्यकता है।

+3

8 डॉट 3 को बंद करना 300,000 फ़ाइलों से ऊपर अनुशंसित है। http://technet.microsoft.com/en-us/library/cc778996(WS.10).aspx आप विंडोज़ के नए संस्करणों पर कमांड लाइन से व्यवहार बदल सकते हैं, उदा। 'fsutil 8dot3name सेट 1'। –

0

एक फ़ोल्डर संरचना है कि फ़ाइलों की एक बड़ी संख्या ज्ञात नहीं करने के लिए स्केल करेगा बनाने के लिए, मैं निम्नलिखित प्रणाली की तरह है:

स्प्लिट निश्चित लंबाई टुकड़ों में फ़ाइल नाम, और उसके बाद पिछले छोड़कर प्रत्येक टुकड़े के लिए नेस्टेड फ़ोल्डरों पैदा करते हैं।

इस प्रणाली का लाभ यह है कि फ़ोल्डर संरचना की गहराई केवल फ़ाइल नाम की लंबाई के रूप में गहराई से बढ़ती है। इसलिए यदि आपकी फ़ाइलें स्वचालित रूप से संख्यात्मक अनुक्रम में उत्पन्न होती हैं, तो संरचना केवल गहरी है, इसकी आवश्यकता होती है।

12.jpg -> 12.jpg 
123.jpg -> 12\123.jpg 
123456.jpg -> 12\34\123456.jpg 

इस दृष्टिकोण का अर्थ यह है कि फ़ोल्डर्स में फाइलें और सब-फ़ोल्डर्स होते हैं, लेकिन मुझे लगता है कि यह एक उचित व्यापार है।

और यहां एक सुंदर पावरशेल एक-लाइनर आपको जाने के लिए है!

$s = '123456' 

-join (($s -replace '(..)(?!$)', '$1\' -replace '[^\\]*$',''), $s) 
संबंधित मुद्दे