2009-04-16 9 views
7

मेरे पास एक ऐसा प्रोग्राम है जो बहुत बड़ी टेक्स्ट फ़ाइलों को पढ़ता और लिखता है। हालांकि, इन फ़ाइलों के प्रारूप के कारण (वे बाइनरी डेटा क्या होना चाहिए के ASCII प्रतिनिधित्व हैं), इन फ़ाइलों को वास्तव में बहुत आसानी से संपीड़ित किया जाता है। उदाहरण के लिए, इनमें से कुछ फ़ाइलें 10GB से अधिक आकार में हैं, लेकिन gzip 95% संपीड़न प्राप्त करता है।प्रोग्राम को लिखने/पढ़ने के रूप में मैं एक फ़ाइल को पारदर्शी रूप से संपीड़ित/डिक्रॉप कैसे करूं?

मैं प्रोग्राम को संशोधित नहीं कर सकता लेकिन डिस्क स्पेस कीमती है, इसलिए मुझे इन तरीकों को पढ़ने और लिखने की आवश्यकता है जब वे पारदर्शी रूप से संपीड़ित और डिकंप्रेस किए जा रहे हों।

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

तकनीकी जानकारी: मैं एक आधुनिक लिनक्स पर हूं। कार्यक्रम एक अलग इनपुट और आउटपुट फ़ाइल पढ़ता है। यह दो बार यद्यपि इनपुट फ़ाइल के माध्यम से पढ़ता है। यह क्रम में आउटपुट फाइल लिखता है।

+0

मेरे टैग संपादित करने के लिए स्वतंत्र महसूस करें। मुझे उचित लोगों को चुनना बहुत मुश्किल लगता है। साथ ही, यदि यह एक डुप्लिकेट है, हमेशा की तरह, मुझे बताएं और मुझे हटाने में खुशी होगी ... –

+1

यह प्रोग्रामिंग से संबंधित नहीं है, क्योंकि आप अपना प्रोग्राम नहीं बदल सकते हैं। आपको या तो बड़ी डिस्क, या आर/डब्ल्यू संपीड़ित फ़ाइल सिस्टम की आवश्यकता है। – Alnitak

उत्तर

5

zlibc देखें: http://zlibc.linux.lu/

इसके अलावा, अगर फ्यूज एक विकल्प नहीं है (यानी गिरी बहुत पुराना नहीं है), पर विचार करें: http://www.biggerbytes.be/

+0

क्या मैं zlibc के साथ भी लिख सकता हूं? यह उतना ही महत्वपूर्ण है जितना मैं पढ़ सकता हूं। –

+0

zlibc मुख्य रूप से नए प्रोग्राम लिखने के लिए है जो संकुचित करते हैं, और आपने कहा कि आप अपने प्रोग्राम को स्पर्श नहीं कर सके। मैंने compuFUSED के उल्लेख के लिए इसे एक वोट दिया, जो आपकी समस्या के लिए एक अच्छा फिट लगता है। – unwind

+0

zlibc केवल पढ़ने के लिए है, लेकिन निश्चित रूप से एलडी_PRELOAD तंत्र के माध्यम से भी recompiling के बिना इस्तेमाल किया जा सकता है। – EFraim

2

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

क्या आपको पता है कि आपके एप्लिकेशन को फ़ाइल के माध्यम से खोजना है या नहीं?

क्या आपका एप्लिकेशन stdin, stdout के साथ काम करता है?

हो सकता है कि एक समाधान के लिए एक मिनी संपीड़ित फ़ाइल प्रणाली है कि आपकी फ़ाइलों

जब से तुम अलग इनपुट और आउटपुट फ़ाइल आप निम्न कर सकते है साथ ही एक निर्देशिका में शामिल है बनाने के लिए है: अब

mkfifo readfifo 
mkfifo writefifo 
zcat your inputfile > readfifo & 
gzip writefifo > youroutputfile & 

launch your program ! 

, आप शायद उचित समाधान शायद संपीड़ित फ़ाइल प्रणाली का उपयोग करने के लिए है, इनपुट के क्रम में दो बार पढ़ के साथ मुसीबत में पड़ जाएगा, क्योंकि जैसे ही zcat इनपुट फ़ाइल को पढ़ने समाप्त हो गया है, yout कार्यक्रम एक SIGPIPE संकेत

मिल जाएगा कॉम्फ्यूस की तरह, क्योंकि तब आपको असमर्थित परिचालनों की तलाश करने की ज़रूरत नहीं है।

+0

मैंने आपकी पूछताछ को हल करने के लिए अपना प्रश्न संपादित कर लिया है। कार्यक्रम stdin/बाहर नहीं पढ़ता या लिखता है। –

0

कौन सी भाषा का प्रयोग कर रहे compFUSEd?

यदि आप जावा का उपयोग कर रहे हैं, तो एपीआई दस्तावेज़ में GZipInputStream और GZipOutputStream कक्षाओं पर एक नज़र डालें।

यदि आप सी/सी ++ का उपयोग कर रहे हैं, तो zlibc शायद इसके बारे में जाने का सबसे अच्छा तरीका है।

+0

मैं प्रोग्राम नहीं बदल सकता, इसलिए इसे प्रोग्राम के बाहर काम करना चाहिए। मैं किसी भी भाषा के साथ अच्छा हूं, लेकिन मैंने सोचा कि यह किसी प्रोग्रामिंग की तुलना में लिनक्स के साथ अधिक काम कर रहा था। –

3

btrfs:

https://btrfs.wiki.kernel.org/index.php/Main_Page

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

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

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