Un formato di compressione (ma non necessariamente l'algoritmo) deve essere consapevole del fatto che è possibile utilizzare più thread. O meglio, non necessariamente che usi più thread, ma che stai comprimendo i dati originali in più passaggi, parallelamente o in altro modo.
Lasciatemi spiegare.
La maggior parte degli algoritmi di compressione comprime i dati in modo sequenziale. Qualsiasi dato può essere compresso utilizzando le informazioni apprese da dati già compressi. Ad esempio, se stai comprimendo un libro da un autore errato, che usa più parole, cliché e frasi più volte, nel momento in cui l'algoritmo di compressione arriva al secondo + occorrenza di quelle cose, di solito sarà in grado di comprimere l'occorrenza corrente meglio della prima occorrenza.
Tuttavia, un effetto collaterale di ciò è che non è possibile unire realmente due file compressi senza decomprimerli entrambi e ricomprimerli come un unico flusso. La conoscenza di un file non corrisponderebbe all'altro file.
La soluzione, naturalmente, è di dire alla routine di decompressione che "Ehi, ho appena passato a un flusso di dati completamente nuovo, per favore inizia a costruire nuove conoscenze sui dati".
Se il formato di compressione supporta tale codice, è possibile comprimere facilmente più parti contemporaneamente.
Ad esempio, un file da 1 GB può essere diviso in 4 file da 256 MB, comprimere ciascuna parte su un core separato e quindi unire insieme alla fine.
Se si sta costruendo il proprio formato di compressione, è ovviamente possibile creare il supporto da soli.
Se il formato .ZIP o .RAR o uno qualsiasi dei formati di compressione noti può supportare ciò non mi è noto, ma so che il formato .7Z può.
fonte
2009-07-31 08:19:59
Sì, sono d'accordo, non riesco a pensare a librerie di compressione specificamente parallele. Se qualcuno doveva scriverne uno, non posso pensare a come funzionerebbe se non suddividendo i dati grezzi in blocchi e comprimendoli ciascuno su un thread. Tieni presente che se lo dividi in parti troppo piccole ridurrai l'efficienza della compressione (sia in termini di tempo che di dimensioni). –
Una buona menzione di SharpZipLib, in realtà sto già usando. Per quanto riguarda la suddivisione del flusso, sì, sono a conoscenza di tale soluzione, sfortunatamente, il requisito è quello di comprimere un singolo flusso che viene alimentato al mio codice e di scrivere su un singolo flusso compresso, in modo che i dati in ingresso non siano realmente frammentati un opzione. – Gareth
Sembra che tu stia cercando una filettatura molto fine, o "micro-parallelizzazione", se ti va. Se hai il tempo potresti trovare un modo per modificare le subroutine di #ZipLib per usare loop paralleli, come quelli che si trovano in Parallel.NET (o come si chiama). –