Un formato de compresión (pero no necesariamente el algoritmo) debe ser consciente del hecho de que puede usar varios hilos. O mejor dicho, no necesariamente que uses múltiples hilos, sino que estás comprimiendo los datos originales en múltiples pasos, en paralelo o de otra forma.
Déjame explicarte.
La mayoría de los algoritmos de compresión comprimen los datos de forma secuencial. Cualquier información puede ser comprimida usando información aprendida de datos ya comprimidos. Entonces, por ejemplo, si está comprimiendo un libro de un autor malo, que usa muchas de las mismas palabras, clichés y oraciones varias veces, cuando el algoritmo de compresión llega a la segunda ocurrencia de esas cosas, generalmente será capaz de comprimir la ocurrencia actual mejor que la primera ocurrencia.
Sin embargo, un efecto secundario de esto es que no se pueden unir realmente dos archivos comprimidos sin descomprimirlos y volver a comprimirlos como una secuencia. El conocimiento de un archivo no coincidiría con el otro archivo.
La solución, por supuesto, es decirle a la rutina de descompresión que "Hola, acabo de cambiar a un flujo de datos totalmente nuevo, por favor comience a acumular nuevos conocimientos sobre los datos".
Si el formato de compresión es compatible con dicho código, puede comprimir fácilmente varias partes al mismo tiempo.
Por ejemplo, un archivo de 1GB podría dividirse en 4 archivos de 256MB, comprimir cada parte en un núcleo separado y luego unirlas al final.
Si está construyendo su propio formato de compresión, puede, por supuesto, generar soporte para esto usted mismo.
No se sabe si .ZIP o .RAR o cualquiera de los formatos de compresión conocidos pueden soportar esto, pero sé que el formato .7Z puede.
Sí, estoy de acuerdo con esto, no puedo pensar en ninguna biblioteca de compresión específicamente paralela. Si alguien escribiera uno, no puedo pensar cómo funcionaría aparte de dividir los datos sin procesar en fragmentos y comprimirlos en un hilo. Tenga en cuenta que si lo divide en trozos demasiado pequeños, reducirá la eficacia de la compresión (tanto en tiempo como en tamaño). –
Buena mención de SharpZipLib, en realidad ya lo estoy usando. Con respecto a la división de la transmisión, sí, estoy al tanto de esa solución. Desafortunadamente, el requisito es comprimir una única transmisión que se transfiera a mi código y escribir en una sola transmisión comprimida, por lo que dividir los datos entrantes no es realmente cierto. una opción. – Gareth
Parece que está buscando un enhebrado de grano muy fino o "micro-paralelización" si lo desea. Si tiene tiempo, puede encontrar una forma de modificar las subrutinas de #ZipLib para usar bucles paralelizados, como los que se encuentran en Parallel.NET (o como se llame). –