كيف يمكنني ضغط / إلغاء ضغط ملف شديد بشفافية كبرنامج يكتب / يقرأ منه؟

StackOverflow https://stackoverflow.com/questions/755144

سؤال

لدي برنامج يقرأ ويكتب ملفات نصية كبيرة جدا. ومع ذلك، نظرا لتنسيق هذه الملفات (فهي تمثيلات ASCII لما كان يجب أن يكون بيانات ثنائية)، فإن هذه الملفات هي في الواقع مضغوط بسهولة شديدة. على سبيل المثال، بعض هذه الملفات أكثر من 10 جيجابايت في الحجم، ولكن Gzip يحقق ضغط 95٪.

لا يمكنني تعديل البرنامج ولكن مساحة القرص ثمينة، لذلك أحتاج إلى إعداد طريقة يمكنها قراءة هذه الملفات وكتابة هذه الملفات أثناء تواجدها بشفافية وإلغاء ضغطها.

يمكن للبرنامج فقط قراءة الملفات والكتابة فقط، حتى الآن كما أفهم، أحتاج إلى إعداد أنبوب مسمى لكل من المدخلات والإخراج. بعض الناس يشيرون إلى نظام ملفات مضغوطة بدلا من ذلك، والذي يبدو أنه سيعمل أيضا. كيف يمكنني عمل أي عمل؟

المعلومات الفنية: أنا على لينكس الحديثة. يقرأ البرنامج ملف إدخال وإخراج منفصل. يقرأ من خلال ملف الإدخال بالترتيب، رغم ذلك مرتين. يكتب ملف الإخراج بالترتيب.

هل كانت مفيدة؟

المحلول

تحقق من zlibc: http://zlibc.linux.lu/.

أيضا، إذا كان الصمامات عبارة عن خيار (أي النواة غير قديمة جدا)، ففكر في: compfeded http://www.biggerbytes.be/

نصائح أخرى

BTRFS:

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

يوفر الدعم لسريع "ضغط / إلغاء الضغط التلقائي التلقائي" هذه الأيام، وحاضرا (على الرغم من التجريبية المميزة) في حبات أحدث.

لن تعطيك الأنابيب المسماة عمليات دوبلكس كاملة، لذلك سيكون أكثر تعقيدا قليلا إذا كنت بحاجة إلى تقديم اسم ملف واحد فقط.

هل تعرف ما إذا كانت تطبيقاتك تحتاج إلى البحث عن الملف؟

هل عملك يعمل مع Stdin، Stdout؟

ربما يكون الحل هو إنشاء نظام ملفات مضغوط صغير يحتوي على دليل فقط مع ملفاتك

نظرا لأن لديك ملف مدخلات وإخراج منفصل يمكنك القيام بما يلي:

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

launch your program !

الآن، ربما ستظل مشكلة مع القراءة مرتين من أجل الإدخال، لأنه بمجرد انتهاء ZCAT قراءة ملف الإدخال، سيحصل برنامج Yout على إشارة SIGPIPE

على الأرجح الحل المناسب استخدام نظام ملفات مضغوط مثل Compfurs، لأنه لا داعي للقلق بشأن العمليات غير المدعومة مثل البحث.

ما هي اللغة التي تستخدمها؟

إذا كنت تستخدم Java، فلقي نظرة على فئات GzipinputStream و Gzipoutputstream في API Doc.

إذا كنت تستخدم C / C ++، فإن ZLIBC ربما هي أفضل طريقة للذهاب في ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top