एक फ़ोल्डर में कई (10 मिलियन) फाइलें रखने से


17

मैंने अपनी साइट पर एक पूर्वानुमानात्मक खोज (नीचे उदाहरण देखें) सुविधा जोड़ी है जो एक उबंटू सर्वर पर चलती है। यह एक डेटाबेस से सीधा चलता है। मैं प्रत्येक खोज के लिए परिणाम को कैश करना चाहता हूं और इसका उपयोग करता हूं कि यदि यह मौजूद है, तो इसे बनाएं।

क्या एक निर्देशिका में अलग-अलग फ़ाइलों में संभावित cira 10 मिलियन परिणामों को सहेजने में मेरे साथ कोई समस्या होगी? या क्या उन्हें फ़ोल्डर्स में विभाजित करना उचित है?

उदाहरण:


5
विभाजन करना बेहतर होगा। कोई भी कमांड जो उस डायरेक्टरी की सामग्री को सूचीबद्ध करने की कोशिश करता है, वह संभवतः खुद को शूट करने का निर्णय लेगा।
मूरू

8
इसलिए यदि आपके पास पहले से ही एक डेटाबेस है, तो इसका उपयोग क्यों नहीं करें? मुझे यकीन है कि DBMS लाखों रिकॉर्ड बनाम फाइलसिस्टम को संभालने में बेहतर होगा। यदि आप फाइलसिस्टम का उपयोग करने में मृत हैं, तो आपको किसी प्रकार के हैश का उपयोग करके एक विभाजन योजना के साथ आने की आवश्यकता है, इस बिंदु पर यह IMHO लगता है जैसे DB का उपयोग करना कम काम होगा।
रोडमेरा

3
कैशिंग के लिए एक और विकल्प जो आपके मॉडल को बेहतर ढंग से फिट करेगा, वह मेमेकैड या रेडिस हो सकता है। वे प्रमुख मूल्य भंडार हैं (इसलिए वे एकल निर्देशिका की तरह कार्य करते हैं और आप केवल नाम से आइटम एक्सेस करते हैं)। Redis लगातार है (पुनरारंभ होने पर डेटा नहीं खोएगा) जहां मेमेकैस्ट अधिक अस्थायी वस्तुओं के लिए है।
स्टीफन ओस्टरमिलर

2
यहाँ चिकन और अंडे की समस्या है। टूल डेवलपर्स बड़ी संख्या में फाइलों के साथ निर्देशिकाओं को संभाल नहीं पाते हैं क्योंकि लोग ऐसा नहीं करते हैं। और लोग बड़ी संख्या में फ़ाइलों के साथ निर्देशिका नहीं बनाते हैं क्योंकि उपकरण इसे अच्छी तरह से समर्थन नहीं करते हैं। उदाहरण के लिए, मैं एक समय में समझता हूं (और मेरा मानना ​​है कि यह अभी भी सच है), os.listdirअजगर में जनरेटर संस्करण बनाने के लिए एक सुविधा अनुरोध को इस कारण से स्पष्ट रूप से अस्वीकार कर दिया गया था।

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

जवाबों:


25

क्या मेरे पास किसी भी निर्देशिका में अलग-अलग फ़ाइलों में संभावित लगभग 10 मिलियन परिणामों को सहेजने में कोई समस्या होगी?

हाँ। शायद और भी कारण हैं, लेकिन मैं अपने सिर के ऊपर से पोस्ट कर सकता हूं:

  • tune2fsमें एक विकल्प होता है जिसे dir_indexडिफ़ॉल्ट रूप से चालू किया जाता है (उबंटू पर है) जो आपको एक प्रदर्शन हिट देखने से पहले एक निर्देशिका में लगभग 100k फ़ाइलों को संग्रहीत करने देता है। वह 10 मी फाइलों के करीब भी नहीं है जिनके बारे में आप सोच रहे हैं।

  • extफाइलसिस्टम के पास निश्चित संख्या में इनोड होते हैं। प्रत्येक फ़ाइल और निर्देशिका 1 इनोड का उपयोग करती है। df -iअपने विभाजन और इनोड्स मुक्त के दृश्य के लिए उपयोग करें। जब आप इनकोड से बाहर निकलते हैं तो आप नई फाइल या फोल्डर नहीं बना सकते हैं।

  • वाइल्डकार्ड का उपयोग करते समय rmऔर जैसे lsकमांड आदेश का विस्तार करते हैं और "तर्क सूची बहुत लंबी" के साथ समाप्त हो जाएगी। आपको findफ़ाइलों को हटाने या सूचीबद्ध करने के लिए उपयोग करना होगा । और findधीमा हो जाता है।

या क्या उन्हें फ़ोल्डर्स में विभाजित करना उचित है?

हाँ। सबसे निश्चित रूप से। मूल रूप से आप 1 डायरेक्टरी में 10 मी फाइलों को स्टोर भी नहीं कर सकते हैं।

मैं डेटाबेस का उपयोग करेगा। यदि आप इसे किसी वेबसाइट के लिए कैश करना चाहते हैं तो " solr " ("वितरित अनुक्रमण, प्रतिकृति और लोड-संतुलित क्वेरी" प्रदान करना) पर एक नज़र है ।


8

एक ही मुद्दे के साथ समाप्त हुआ। यह जानने के लिए कि क्या आप एक ही फ़ोल्डर में सब कुछ बनाम एक से अधिक फ़ोल्डर्स रख सकते हैं, अपने स्वयं के बेंचमार्क चलाएं। ऐसा प्रतीत होता है कि आप कर सकते हैं और यह तेज़ है!

बेंचमार्क

Ref: https://medium.com/@hartator/benchmark-deep-directory-structure-vs-flat-directory-structure-to-store-millions-of-files-on-ext4-cac1000ca28


1
धन्यवाद, यह बहुत उपयोगी है। मैं एक साइट पर इसका उपयोग कर रहा हूं और इस भाग को /abc/efg.html निर्देशिका संरचनाओं में फिर से प्रोग्राम करना एक वास्तविक समस्या है। इसलिए मैं भविष्य में एक फ्लैट डायरेक्टरी में वापस जाऊंगा।
कोहजा ब्रेज डे

0

एक द्विआधारी खोज आसानी से लाखों रिकॉर्डों को संभाल सकती है इसलिए एकल निर्देशिका को खोजना कोई समस्या नहीं होगी। यह बहुत तेजी से करेगा।

मूल रूप से यदि आप 32 बिट सिस्टम का उपयोग कर रहे हैं, तो 2Gb रिकॉर्ड तक बाइनरी खोज आसान और अच्छा है।

Berekely DB, एक खुला स्रोत सॉफ्टवेयर, आसानी से आपको एक प्रविष्टि के तहत पूर्ण परिणाम को स्टोर करने की अनुमति देगा और इसमें निर्मित खोज होगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.