سؤال

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

بالطبع، يمكنني ضغط كل مقالات بشكل فردي، لكن هذا لن يمنح الكثير من نسبة الضغط. سمعت أن ملف مضغوط LZO يتكون من العديد من القطع التي يمكن إلغاء ضغطها بشكل منفصل، لكنني لم أجد وثائق API + لذلك. يمكنني أيضا استخدام وضع z_full_flush في Zlib، ولكن هل هناك أي بديل أفضل آخر؟

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

المحلول

XZ.دعم الملفات تدعم فهرس، على الرغم من افتراضي الفهرس غير مفيد. ضاغطي، بيكز, ، ينشئ الملفات التي تحتوي على فهرس مفيد. يمكنك استخدام الوظائف الموجودة في مكتبة Liblzma للعثور على كتلة من بيانات XZ تتوافق مع الموقع في البيانات غير المضغوطة.

نصائح أخرى

للبناء القابل للبناء على GZIP، هناك Dictzip من خادم Dict و Sgzip من Sleuth Kit

لاحظ أنه لا يمكنك الكتابة إلى أي من هذه ويمكن البحث عن قابلا للقراءة بأي طريقة

dotnetzip. هي مكتبة أرشيف البريدي ل .NET.

باستخدام Dotnetzip، يمكنك الرجوع إلى إدخالات معينة في ZIP بشكل عشوائي، ويمكن إلغاء ضغطها خارج الترتيب، ويمكن أن تعيد دفق يقوم بتشغيله لأنه يستخرج إدخالا.

مع الاستفادة من هذه الميزات، تم استخدام Dotnetzip في تنفيذ أ موفر المسار الظاهري ل ASP.NET, ، هذا هو بالضبط ما تصفه - إنه يخدم جميع المحتويات لموقع ويب معين من ملف مضغوط مضغوط. يمكنك أيضا أن تقوم بوحدات المواقع ذات الصفحات الديناميكية (ASP.NET).

ASP.NET Zip Virtual ProTe موفر، بناء على Dotnetzip

يبدو الكود المهم مثل هذا:

namespace Ionic.Zip.Web.VirtualPathProvider
{
    public class ZipFileVirtualPathProvider : System.Web.Hosting.VirtualPathProvider
    {
        ZipFile _zipFile;

        public ZipFileVirtualPathProvider (string zipFilename) : base () {
            _zipFile =  ZipFile.Read(zipFilename);
        }

        ~ZipFileVirtualPathProvider () { _zipFile.Dispose (); }

        public override bool FileExists (string virtualPath)
        {
            string zipPath = Util.ConvertVirtualPathToZipPath (virtualPath, true);
            ZipEntry zipEntry = _zipFile[zipPath];

            if (zipEntry == null)
                return false;

            return !zipEntry.IsDirectory;
        }

        public override bool DirectoryExists (string virtualDir)
        {
            string zipPath = Util.ConvertVirtualPathToZipPath (virtualDir, false);
            ZipEntry zipEntry = _zipFile[zipPath];

            if (zipEntry != null)
                return false;

            return zipEntry.IsDirectory;
        }

        public override VirtualFile GetFile (string virtualPath)
        {
            return new ZipVirtualFile (virtualPath, _zipFile);
        }

        public override VirtualDirectory GetDirectory (string virtualDir)
        {
            return new ZipVirtualDirectory (virtualDir, _zipFile);
        }

        public override string GetFileHash(string virtualPath, System.Collections.IEnumerable virtualPathDependencies)
        {
            return null;
        }

        public override System.Web.Caching.CacheDependency GetCacheDependency(String virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
        {
            return null;
        }
    }
}

ويتم تعريف VirtualFile مثل هذا:

namespace Ionic.Zip.Web.VirtualPathProvider
{
    class ZipVirtualFile : VirtualFile
    {
        ZipFile _zipFile;

        public ZipVirtualFile (String virtualPath, ZipFile zipFile) : base(virtualPath) {
            _zipFile = zipFile;
        }

        public override System.IO.Stream Open () 
        {
            ZipEntry entry = _zipFile[Util.ConvertVirtualPathToZipPath(base.VirtualPath,true)];
            return entry.OpenReader();
        }
    }
}

BGZF هو التنسيق المستخدم في الجينوم.http://biopython.org/dist/docs/api/bio.bgzf-module.html.

إنه جزء من مكتبة Samtools C و حقا مجرد اختراق بسيط حول gzip. ربما يمكنك إعادة كتابةها بنفسك إذا كنت لا ترغب في استخدام تطبيق Samtools C أو تطبيق Picard Java. BioPython ينفذ متغير بيثون.

لم تحدد نظام التشغيل الخاص بك. هل سيكون من الممكن تخزين ملفك في دليل مضغوط يديره نظام التشغيل؟ ثم سيكون لديك جزء "قابل للبدد" وكذلك الضغط. سيتم التعامل مع وحدة المعالجة المركزية العامة لك مع أوقات الوصول غير المتوقعة.

أنا أستخدم MS Windows Vista، لسوء الحظ، ويمكنني إرسال مستكشف الملفات إلى ملفات ZIP كما لو كانت ملفات عادية. من المفترض أنه لا يزال يعمل في 7 (الذي أود أن أكون عليه). أعتقد أنني فعلت ذلك مع المنفعة المقابلة على أوبونتو، أيضا، لكنني لست متأكدا. يمكنني أيضا اختباره على Mac OSX، أفترض.

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

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

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

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

للحصول على تقنيات أكثر تطورا، قد تنظر في

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