2012-05-21 13 views
8

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

इसके अलावा, मेरे मामले में, स्मृति सीमा समय की तुलना में अधिक महत्वपूर्ण है। जिसका अर्थ है कि मैं अधिक समय बचाने के बजाय और अधिक स्मृति को बचाने के बजाय।

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

+0

इनके रूप में हटाएं: एक सिस्टम आधारित है जिस पर आपका कोई नियंत्रण नहीं है? या एक डिलीट जो कुछ एप्लिकेशन द्वारा ट्रिगर किया गया है जिसमें आप कुछ कर सकते हैं? – Krrose27

+0

स्कैनिंग प्रक्रिया बहुत मेमोरी का उपयोग क्यों करती है? आप मूल रूप से फ़ाइलों को एक समय में एक निर्देशिका में सूचीबद्ध कर रहे हैं, है ना? – Joni

+0

हाँ, हालांकि, मैं निर्देशिका पर कितनी फाइलों को नियंत्रित नहीं कर सकता। एक निर्देशिका में 1 अरब फाइलें हो सकती हैं। इसके अलावा, अगर मैं तुरंत एक फ़ाइल स्कैन करता हूं तो मैं एक डेटा डालता हूं, यह बहुत मेमोरी बचाता है लेकिन वास्तव में समय लेने वाली है क्योंकि आई/ओ समस्याएं हैं। यदि मैं थोक सम्मिलन का उपयोग करता हूं, तो यह अधिक कुशल है। – s011208

उत्तर

0

सिद्धांत रूप में, आप निर्देशिकाओं पर "संशोधित" टाइमस्टैम्प की जांच करके चीजों को गति दे सकते हैं। यदि कोई निर्देशिका संशोधित नहीं की गई है, तो आपको उस निर्देशिका में से किसी भी फाइल को जांचने की आवश्यकता नहीं है। दुर्भाग्यवश, आपको संभावित उपनिर्देशिका को स्कैन करने की आवश्यकता है, और उन्हें ढूंढने में निर्देशिका स्कैनिंग शामिल है ... जब तक आप निर्देशिका वृक्ष संरचना को सहेज नहीं लेते हैं।

और निश्चित रूप से, यह म्यूट है कि आपके पास एक अरब निर्देशिका वाली एक फ्लैट निर्देशिका है।


मैं कल्पना है कि आप स्मृति में filepaths के सभी ताकि आप उन्हें डेटाबेस क्वेरी करने से पहले सॉर्ट कर सकते हैं कोडांतरण कर रहे हैं। (और उन्हें सॉर्ट करना एक अच्छा विचार है ...) हालांकि स्मृति में सॉर्ट करने का एक विकल्प है:

  1. फ़ाइल में फ़ाइलपैथ लिखें।
  2. फ़ाइल को प्राथमिक कुंजी क्रम में सॉर्ट करने के लिए बाहरी सॉर्ट उपयोगिता का उपयोग करें।
  3. सॉर्ट की गई फ़ाइल पढ़ें, और कुंजी ऑर्डर में डेटाबेस के विरुद्ध बैच क्वेरी करें।

(आप वास्तव में एक डिस्क पर एक अरब फ़ाइलें है? यही कारण है कि अपने डेटा स्टोर के लिए एक बुरा डिजाइन की तरह लगता है ...)

+0

मैं बाहरी डिस्क में कभी भी एक बिलियन फाइल नहीं डालूंगा, यह वास्तव में एक आपदा है; हालांकि, मैं वादा नहीं कर सकता कि सभी उपयोगकर्ता ऐसा नहीं करेंगे। – s011208

+0

@ s011208 - अच्छी तरह से मैं उपयोगकर्ताओं को यह बताने के इच्छुक हूं कि अगर उनकी प्रणाली लंबे समय तक डिस्क पर हास्यास्पद संख्या में फाइलें डालती है तो यह उनकी गलती है। –

1

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

update files in database: set "seen on this scan" to false 
for each file on disk do: 
    insert/update database, setting "seen on this scan" to true 
done 
deleted files = select from files where "seen on this scan" = false 

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

1 बिलियन फाइलों के साथ निर्देशिकाओं के लिए, आपको केवल उस कोड को प्रतिस्थापित करने की आवश्यकता है जो फ़ाइलों को सूचीबद्ध करता है जो सी फ़ंक्शन opendir और readdir को लपेटता है। अगर मैं था तो आप इसके बारे में ज्यादा चिंता नहीं करेंगे। किसी भी निर्देशिका में किसी भी व्यक्ति के पास 1 अरब फाइलें नहीं होती हैं क्योंकि उस तरह की चीज फाइल सिस्टम और सामान्य ओएस टूल्स को क्रिप्ल करती है, इसलिए जोखिम कम होता है और समाधान आसान होता है।

+0

आपका समाधान एंड्रॉइड सिस्टम वास्तव में क्या करता है! लेकिन इस समाधान का नकारात्मक हिस्सा यह है कि आपको स्मृति में फ़ाइलों की विशेषता को संग्रहीत करना होगा, मानचित्र कहें। हालांकि, एंड्रॉइड मेमोरी सीमा है! जब आपके पास केवल 10 हजार फाइलें होंगी, तो यह ठीक है। यदि आपको सौ से अधिक हजार फाइलें मिलती हैं, तो कार्यक्रम को खत्म करने के लिए मजबूर किया जाएगा। अब मेरे प्रश्न की तरह, मैं डिस्क में सभी फ़ाइलों को खंडों में कटौती करने का एक तरीका ढूंढना चाहता हूं ताकि मैं एक बार में एक सेक्शन कर सकूं और स्मृति सीमा समस्या से बच सकूं! – s011208

+1

रैम में फ़ाइलों के गुणों को क्यों संग्रहीत किया जाना चाहिए, डेटाबेस यही है, है ना? या क्या आपका मतलब थोक प्रविष्टि के लिए उपयोग की जाने वाली अस्थायी सूची है? आप एक निश्चित आकार का उपयोग करने के बजाय उपलब्ध स्मृति के आधार पर गतिशील रूप से थोक आकार का चयन कर सकते हैं ... – Joni

0

क्या आपके पास हटाए जाने पर हटाए जाने की सूची है (या इसे बनाने के लिए जो भी प्रक्रिया हटा दी जाती है)?यदि ऐसा नहीं है तो आपके पास टाइमस्टैम्प के साथ "मुझे हटा दिया गया है" की एक सूची नहीं हो सकती है, और फिर इस सूची से आइटम को केवल उस चीज़ पर सिंक्रनाइज़ करने के लिए चुनें जो बदले गए हैं? स्वाभाविक रूप से, आप अभी भी सर्वर पर धीमे समय के दौरान सिंक करने के लिए किसी प्रकार का बैच नौकरी चाहते हैं, लेकिन मुझे लगता है कि लोड को कम कर सकता है।

कोड बदलने के आधार पर एक और विकल्प हो सकता है, उस प्रक्रिया को केवल डेटाबेस को अद्यतन करने के लिए (यदि आपके पास एकाधिक नोड्स हैं) सीधे हटाए जाने पर। यह सिस्टम में कुछ युग्मन पेश करेगा, लेकिन ऐसा करने का सबसे प्रभावी तरीका होगा।

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

यहां तक ​​कि इन सभी के साथ भी, आपको यह सुनिश्चित करने के लिए इंडेक्स पर किसी प्रकार का इंडेक्स सिंक्रनाइज़ेशन या आवधिक स्वच्छता जांच की आवश्यकता होगी ताकि सबकुछ ठीक से मेल हो।

आप (और यदि आपके पास फाइलों की संख्या के आधार पर आपको नहीं होना चाहिए तो फ़ाइल चौंका देने के लिए फ़ोल्डरों में विभाजित करना होगा), और कहें, प्रति फ़ोल्डर 5,000-10,000 फाइलें, और फिर बनाएं एक साधारण फ़ाइल जिसमें फ़ोल्डर में सभी फ़ाइलों के नाम हैंश है। यह हटाएगा, लेकिन मुझे अभी भी लगता है कि हटाए जाने पर कुछ रूपों का सीधा कॉलबैक एक बेहतर विचार है। यदि आपके पास इन सभी चीजों के साथ एक मोनोलिथिक फ़ोल्डर है, तो इसे अलग फ़ोल्डर्स में तोड़ने के लिए कुछ बनाते हैं (हमने मुख्य फ़ोल्डर के तहत सरल संख्या का उपयोग किया ताकि हम विज्ञापन नोडम पर जा सकें) सबकुछ तेज़ी से बढ़ाना चाहिए; भले ही आपको यह सभी नई फाइलों के लिए करना है और पुरानी फाइलों को जगह में छोड़ना है, कम से कम आप फ़ाइल पुनर्प्राप्ति पर खून बह रहा है।

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

0

यदि स्मृति महत्वपूर्ण है तो मैं ऑपरेशन सिस्टम सुविधाओं के लिए जाऊंगा।

यदि आपके पास ext4 है तो मुझे लगता है कि आप यूनिक्स पर हैं (आप Win जैसे अन्य ऑपरेशन सिस्टम पर इंस्टॉल कर सकते हैं)। यदि ऐसा होता है तो आप मूल खोज कमांड का उपयोग कर सकते हैं (यह आखिरी मिनट के लिए होगा, आप निश्चित रूप से अंतिम स्कैन समय याद कर सकते हैं और इसे जो कुछ भी पसंद करते हैं उसे संशोधित कर सकते हैं): ढूंढें/directory_path -type f -mtime -1 -प्रिंट

बेशक आपके पास हटाना नहीं होगा। यदि एक ह्युरिस्टिक एल्गोरिदम आपके लिए काम करता है तो आप एक थ्रेड बना सकते हैं जो धीरे-धीरे आपके डेटाबेस में संग्रहीत प्रत्येक फ़ाइल में जाता है (जो भी आपको पहले से नए से पुराने में प्रदर्शित करने की आवश्यकता होती है) और जांचें कि यह अभी भी ऑनलाइन है। यह ज्यादा स्मृति का उपभोग नहीं करेगा। मुझे लगता है कि आप उपयोगकर्ता को एक अरब फाइलें दिखाने में सक्षम नहीं होंगे।

संबंधित मुद्दे