在.NET中是否存在一個對數據流進行多線程壓縮的庫?我在想像System.IO.GZipStream
內建的東西,但使用多線程來執行工作(從而利用所有的cpu核心)。C中的多線程壓縮#
我知道,例如使用多線程的7-zip壓縮,但他們發佈的C#SDK似乎沒有這樣做。
在.NET中是否存在一個對數據流進行多線程壓縮的庫?我在想像System.IO.GZipStream
內建的東西,但使用多線程來執行工作(從而利用所有的cpu核心)。C中的多線程壓縮#
我知道,例如使用多線程的7-zip壓縮,但他們發佈的C#SDK似乎沒有這樣做。
我認爲你最好的選擇是自己以相同的時間間隔分割數據流,如果使用非並行化算法,啓動線程並行壓縮每個部分。 (之後單個線程將它們連接成一個流(您可以創建一個流類,在當前流結束時繼續從下一個流讀取))。
你可能想看看SharpZipLib,它比.NET中的內在壓縮流要好一些。
編輯:當然,您需要一個標題來告訴每個新流的開始位置。 :)
壓縮格式(但不一定是算法)需要知道您可以使用多個線程的事實。或者說,不一定你使用多個線程,但是你要以多個步驟,平行或其他方式壓縮原始數據。
讓我解釋一下。
大多數壓縮算法以順序方式壓縮數據。任何數據都可以通過使用從已壓縮數據中學習的信息進行壓縮。例如,如果你正在壓縮一個壞作者的書,而這個壞作者會多次使用許多相同的詞,陳詞濫調和句子,到壓縮算法到達第二個+這些事情發生的時候,它通常會是能夠比第一次出現更好地壓縮當前事件。
但是,這樣做的一個副作用是,如果不解壓兩個壓縮文件並將它們重新壓縮爲一個流,則無法將兩個壓縮文件真正拼接在一起。來自一個文件的知識不會與其他文件匹配。
解決方案當然是告訴解壓程序「嘿,我剛剛切換到全新的數據流,請重新開始建立有關數據的知識」。
如果壓縮格式支持這樣的代碼,您可以很容易地同時壓縮多個部分。例如,1GB文件可以分成4個256MB文件,將每個部分壓縮在單獨的核心上,然後在最後將它們拼接在一起。
如果你正在構建你自己的壓縮格式,你當然可以自己建立對此的支持。
無論.ZIP或.RAR還是任何已知的壓縮格式都可以支持這一點,我不知道,但我知道.7Z格式可以。
發現這個庫:http://www.codeplex.com/sevenzipsharp
看起來它封裝了非託管7z.dll它不支持多線程。顯然不理想的包裝非託管代碼,但它看起來像這是目前唯一的選擇。
通常我會說英特爾並行工作室,它可以讓你開發專門針對多核系統的代碼,但現在它只用C/C++。也許只需在C/C++中創建lib,然後從C#代碼中調用它?
我最近發現了一個支持多線程bzip壓縮的壓縮庫:DotNetZip。關於這個庫的好處是,ParallelBZip2OutputStream類是從System.IO.Stream派生的,並將System.IO.Stream作爲輸出。這意味着您可以創建自System.IO.Stream派生類相似鏈:
在這種情況下,我們創建一個.tar.bz文件,對其進行加密(可能與AES),並直接將其寫入文件。
是的,我同意這一點,我想不出任何專門的並行壓縮庫。如果有人寫了一個,我想不出它是如何工作的,除了將原始數據分成塊並壓縮每個線程。請注意,如果將其分割成更小的塊,則會降低壓縮效率(時間和大小)。 – 2009-07-31 08:20:38
好的提到SharpZipLib,我實際上已經在使用它了。關於分割流,是的,我意識到這個解決方案,不幸的是,需要壓縮一個單一的流到我的代碼,並寫出一個壓縮的流,所以分塊傳入的數據並不是真的一個選項。 – Gareth 2009-07-31 08:22:36