Ein Komprimierungsformat (aber nicht unbedingt der Algorithmus) muss sich der Tatsache bewusst sein, dass Sie mehrere Threads verwenden können. Oder, nicht unbedingt, dass Sie mehrere Threads verwenden, sondern dass Sie die ursprünglichen Daten in mehreren Schritten parallel oder anderweitig komprimieren.
Lassen Sie mich erklären.
Die meisten Komprimierungsalgorithmen komprimieren Daten sequenziell. Alle Daten können komprimiert werden, indem Informationen verwendet werden, die von bereits komprimierten Daten gelernt wurden. Wenn Sie zum Beispiel ein Buch von einem schlechten Autor komprimieren, der viele gleiche Wörter, Klischees und Sätze mehrfach verwendet, wird der Komprimierungsalgorithmus in der Regel zu dem Zeitpunkt sein, zu dem der Komprimierungsalgorithmus zum zweiten + Vorkommen kommt in der Lage, das aktuelle Vorkommen besser zu komprimieren als das erste Vorkommen.
Ein Nebeneffekt davon ist jedoch, dass Sie nicht wirklich zwei komprimierte Dateien zusammenfügen können, ohne beides zu dekomprimieren und sie als einen Stream neu zu komprimieren. Das Wissen aus einer Datei würde nicht mit der anderen Datei übereinstimmen.
Die Lösung ist natürlich, der Dekompressionsroutine zu sagen: "Hey, ich bin gerade auf einen völlig neuen Datenstrom umgestiegen, bitte fange an, neues Wissen über die Daten aufzubauen".
Wenn das Komprimierungsformat einen solchen Code unterstützt, können Sie mehrere Komponenten gleichzeitig problemlos komprimieren.
Zum Beispiel könnte eine 1GB-Datei in 4 256MB-Dateien aufgeteilt werden, jeden Teil auf einem separaten Kern komprimieren und dann am Ende zusammenfügen.
Wenn Sie Ihr eigenes Komprimierungsformat erstellen, können Sie natürlich selbst Unterstützung dafür erstellen.
Ob .ZIP oder .RAR oder eines der bekannten Komprimierungsformate können dies unterstützen, ist mir unbekannt, aber ich kenne das .7Z-Format kann.
Ja, ich stimme dem zu, ich kann mir keine spezifisch parallelen Komprimierungsbibliotheken vorstellen. Wenn jemand eines schreiben würde, kann ich nicht denken, wie es funktionieren würde, abgesehen davon, dass die Rohdaten in Stücke aufgeteilt und jeweils auf einem Thread komprimiert werden. Beachten Sie, dass Sie die Effizienz der Komprimierung (sowohl Zeit als auch Größe) verringern, wenn Sie sie in zu kleine Teile aufteilen. –
Gute Erwähnung von SharpZipLib, ich benutze es eigentlich schon. Bezüglich der Aufteilung des Streams, ja, ich bin mir dieser Lösung bewusst, leider ist die Anforderung, einen einzigen Stream zu komprimieren, der in meinen Code eingespeist wird, und in einen einzelnen komprimierten Stream zu schreiben, so dass das Chunking der eingehenden Daten nicht wirklich ist eine Option. – Gareth
Scheint, als ob Sie nach sehr feinkörnigem Threading oder "Mikro-Parallelisierung" suchen, wenn Sie möchten. Wenn Sie Zeit haben, finden Sie möglicherweise eine Möglichkeit, Subroutinen von #ZipLib zu modifizieren, um parallelisierte Schleifen zu verwenden, wie sie in Parallel.NET (oder wie auch immer es genannt wird) zu finden sind. –