2011-04-24 28 views
0

我們在工作中的應用程序基本上每天晚上必須創建超過一百萬個對象才能運行涉及一天中記錄的一些天氣觀測的數值模擬。通過壓縮和存儲對象來減少字符串大小

每個對象包含幾個字符串屬性(和一個非常大的xml屬性 - 大約2 MB) - 使用大xml屬性的大小我們不加載它,而是更喜歡在我們需要訪問時訪問數據庫這個XML blob(我們爲每個對象做)

我想知道是否有意義以某種方式檢索XML數據(這是2MB)將其壓縮在內存中並將其存儲在對象中 - 這可以防止我們必須做當我們處理它時,每個對象都有一個數據庫查詢。

我寧願壓縮的數據,其存儲在對象和處理時間,解壓縮和處理

是否可以壓縮過程一個字符串,我怎麼能做到這一點沒有創造數以百萬MemoryStreams的/每個對象的zip流?

+1

每個對象的XML是不同的? – Oded 2011-04-24 06:01:58

+0

是的,他們是不同的 – 2011-04-24 06:32:16

回答

1

我會認爲壓縮不是一個好主意 - 它增加了相當的處理開銷,這似乎已經相當密集。

也許輕量級格式會更好 - JSON或表示數據的二進制序列化對象。

沒有更多的細節,很難給出明確的答案或更好的選擇。

+0

我無法控制的XML - 它的要求,我不能改變 - 有興趣看看我是否可以二進制seriliase的XML字符串,但我認爲它更好地簡單地壓縮 – 2011-04-24 06:32:08

+0

我不會嘗試二進制序列化XML。我的意思是以你的數據和二進制序列化的形式創建一個對象。 – Oded 2011-04-24 06:46:39

1

那麼,有DotNetZip其中有一個簡單的API,所以你可以做這樣的事情:

byte[] compressedProperty; 
public string MyProperty 
{ 
    get { DeflateStream.UncompressString(compressedProperty); } 
    set { compressedProperty = DeflateStream.CompressString(value); } 
} 

不知道它會工作雖然表現出明智的你。

更新: 我只知道GZipStreamDeflateStream類。他們都沒有暴露一個string接口。即使DotNetZip在調用上述函數時也會使用流引擎,它只是圍繞着一個不錯的界面(您可以使用自己的System.IO.Compression類來完成)。不知道你的問題是什麼與流。 如果你真的想避免流,那麼你可能不得不推出自己的壓縮。 Here is a guy誰推出了一個簡單的霍夫曼編碼器在F#中編碼字符串。不知道它有多好,但我想避免第三方庫和流,然後你可以給它一個裂縫。

+0

BCL圖書館有類似的東西嗎? .NET是否允許在不使用流的情況下壓縮字符串? – 2011-04-24 08:14:47

+0

@CycleMachine:我更新了一下我的答案。 – ChrisWue 2011-04-24 08:35:19