2009-07-31 32 views
6

在.NET中是否存在一個對數據流進行多線程壓縮的庫?我在想像System.IO.GZipStream內建的東西,但使用多線程來執行工作(從而利用所有的cpu核心)。C中的多線程壓縮#

我知道,例如使用多線程的7-zip壓縮,但他們發佈的C#SDK似乎沒有這樣做。

回答

7

我認爲你最好的選擇是自己以相同的時間間隔分割數據流,如果使用非並行化算法,啓動線程並行壓縮每個部分。 (之後單個線程將它們連接成一個流(您可以創建一個流類,在當前流結束時繼續從下一個流讀取))。

你可能想看看SharpZipLib,它比.NET中的內在壓縮流要好一些。

編輯:當然,您需要一個標題來告訴每個新流的開始位置。 :)

+0

是的,我同意這一點,我想不出任何專門的並行壓縮庫。如果有人寫了一個,我想不出它是如何工作的,除了將原始數據分成塊並壓縮每個線程。請注意,如果將其分割成更小的塊,則會降低壓縮效率(時間和大小)。 – 2009-07-31 08:20:38

+0

好的提到SharpZipLib,我實際上已經在使用它了。關於分割流,是的,我意識到這個解決方案,不幸的是,需要壓縮一個單一的流到我的代碼,並寫出一個壓縮的流,所以分塊傳入的數據並不是真的一個選項。 – Gareth 2009-07-31 08:22:36

0

壓縮格式(但不一定是算法)需要知道您可以使用多個線程的事實。或者說,不一定你使用多個線程,但是你要以多個步驟,平行或其他方式壓縮原始數據。

讓我解釋一下。

大多數壓縮算法以順序方式壓縮數據。任何數據都可以通過使用從已壓縮數據中學習的信息進行壓縮。例如,如果你正在壓縮一個壞作者的書,而這個壞作者會多次使用許多相同的詞,陳詞濫調和句子,到壓縮算法到達第二個+這些事情發生的時候,它通常會是能夠比第一次出現更好地壓縮當前事件。

但是,這樣做的一個副作用是,如果不解壓兩個壓縮文件並將它們重新壓縮爲一個流,則無法將兩個壓縮文件真正拼接在一起。來自一個文件的知識不會與其他文件匹配。

解決方案當然是告訴解壓程序「嘿,我剛剛切換到全新的數據流,請重新開始建立有關數據的知識」。

如果壓縮格式支持這樣的代碼,您可以很容易地同時壓縮多個部分。例如,1GB文件可以分成4個256MB文件,將每個部分壓縮在單獨的核心上,然後在最後將它們拼接在一起。

如果你正在構建你自己的壓縮格式,你當然可以自己建立對此的支持。

無論.ZIP或.RAR還是任何已知的壓縮格式都可以支持這一點,我不知道,但我知道.7Z格式可以。

-1

通常我會說英特爾並行工作室,它可以讓你開發專門針對多核系統的代碼,但現在它只用C/C++。也許只需在C/C++中創建lib,然後從C#代碼中調用它?

4

我最近發現了一個支持多線程bzip壓縮的壓縮庫:DotNetZip。關於這個庫的好處是,ParallelBZip2OutputStream類是從System.IO.Stream派生的,並將System.IO.Stream作爲輸出。這意味着您可以創建自System.IO.Stream派生類相似鏈:

  • 系統

    • ICSharpCode.SharpZipLib.Tar.TarOutputStream
    • Ionic.BZip2.ParallelBZip2OutputStream(從DotNetZip庫) .Security.Cryptography.CryptoStream(加密)
    • System.IO.FileStream

    在這種情況下,我們創建一個.tar.bz文件,對其進行加密(可能與AES),並直接將其寫入文件。