2013-08-07 7 views
11

विशिष्ट फाइल सिस्टम, और POSIX इंटरफ़ेस, केवल अंत में फ़ाइल को आकार देने की अनुमति देता है। आम तौर पर इसे बंद होने के बाद "डिस्क पर" फ़ाइल का आकार पढ़ने के दौरान पढ़ने/लिखने की स्थिति के ऑफसेट के बराबर होता है। बंद होने से पहले की तलाश में "अंत फ़ाइल को पुनर्स्थापित करना" भी कहा जाता है।क्या फाइल सिस्टम फाइल की शुरुआत को पुनर्स्थापित करने की अनुमति देता है?

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

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

+2

बंद मतदाताओं ... एक लिनक्स एपीआई के लिए पूछ अनिवार्य रूप से यह एक बनाता है "प्रोग्रामिंग के बारे में प्रश्न।" अगर आपको जवाब देने में असमर्थ होने के बारे में बुरा अपर्याप्त लगता है, तो कहीं और सुल्क जाओ। – Potatoswatter

उत्तर

1

असल में, लिनक्स में एक इंटरफ़ेस है जो आप अनुरोध कर रहे हैं। यह फोकोक करने के लिए FALLOC_FL_COLLAPSE_RANGE ध्वज है। यह आधुनिक कर्नेल पर btrfs, ext4, और xfs (संभवतः अन्य) द्वारा समर्थित है। हालांकि फॉलोकोक इंटरफ़ेस आपको बाइट ऑफ़सेट और लम्बाई निर्दिष्ट करने की अनुमति देता है, अभ्यास में COLLAPSE_RANGE कॉल केवल तभी काम करेगा जब ऑफसेट और लंबाई फ़ाइल सिस्टम ब्लॉक आकार का एक बहु हो।

अधिक जानकारी के लिए (2) सिस्टम कॉल fallocate के लिए ललित मैनुअल देखें: http://man7.org/linux/man-pages/man2/fallocate.2.html

+0

धन्यवाद! पुराना 'FALLOC_FL_PUNCH_HOLE' ध्वज भी ऑफसेट को स्थानांतरित किए बिना व्यावहारिक समस्या हल करता है। मैंने कोशिश नहीं की है, लेकिन मैनपेज बताता है कि यह विश्वसनीय रूप से बाइट्स के साथ काम करता है। – Potatoswatter

+0

यह उन्हें शून्य करके बाइट्स के साथ काम करता है। यदि आप फ़ाइल सिस्टम पर वापस स्थान जारी करने का प्रयास कर रहे हैं, तो यह केवल 4k भागों में गठबंधन में ही करेगा। –

1

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

+0

यदि हटाए गए ब्लॉक पूरी तरह से शून्य हो सकते हैं, तो यह ओपी की प्रस्तावित योजना के जितना ही कुशल है क्योंकि यूनिक्स एफएस एक स्पैस प्रतिनिधित्व का उपयोग करते हैं जहां शून्य ब्लॉक संग्रहीत नहीं होते हैं। –

+1

@ लार्समैन: दुर्भाग्यवश एक गैर-स्पैस फ़ाइल को एक स्पैस फ़ाइल में बदलना सस्ता नहीं है, भले ही प्रश्न में बाइट्स को शून्य कर दिया गया हो। –

4

नहीं। यूनिक्स दुनिया में नहीं, किसी भी दर पर।

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

ऐसे कार्यों की सीधी उपयोगिता भी अस्पष्ट है। उनका उपयोग कौन करेगा? कितनी बार?

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

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

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

1

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

यदि आपका मुख्य लक्ष्य डिस्क स्थान को बचाने के लिए है, तो कई दृष्टिकोण हैं।

यदि आपके पास ZFS समर्थन है और deduplication सक्षम है, तो पहले फ़ाइल के प्रारंभ (या वास्तव में किसी भी भाग) के डेटा को संग्रहीत करने के लिए उपयोग किए गए ब्लॉक को शून्य से ओवरराइट करके मुक्त किया जा सकता है।

लिनक्स के तहत, आपको fallocate सिस्टम कॉल का उपयोग करके FALLOC_FL_PUNCH_HOLE ध्वज का उपयोग करके फ़ाइल सिस्टम में फ़ाइल स्टोर के हिस्सों को मुक्त करने में सक्षम होना चाहिए। सोलारिस समान fcntl कमांड F_FREESP प्रदान करता है। चाहे fallocate या fcntl कुशलता से काम करेगा या फिर कार्यान्वयन पर निर्भर है।

वैकल्पिक रूप से, आप एक ओएस है कि एक fallocate या समकक्ष कार्यक्षमता प्रदान नहीं करता है, लेकिन समर्थन करता है ZFS चलाते हैं (जैसे: FreeBSD), और/या अगर डिडुप्लीकेशन एक विकल्प है क्योंकि आप इसे करने के लिए समर्पित करने के लिए पर्याप्त नहीं रैम की जरूरत नहीं है, एक हल्के विकल्प सिर्फ फाइल सिस्टम पर संपीड़न को सक्षम करने के लिए होगा।

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