2013-04-01 45 views
2

我實現一個系統,可以讀取XML文件,加密和壓縮它們,然後發送到Web服務作爲流 我測試的XML文件大小從1KB到26MB不等。 當我將代碼作爲單線程運行時,它看起來運行良好。 但是,當我的代碼更新爲多線程時,它在處理大文件時會在代碼的不同部分拋出內存異常。C#,同時將字符串轉換爲byte []和byte []字符串我離開了內存異常

下面是代碼塊,我的代碼拋出異常:

1.

RijndaelManaged sessionKey = new RijndaelManaged(); 
sessionKey.KeySize = 256; 
EncryptedXml eXml = new EncryptedXml(); 
byte[] encryptedElement = eXml.EncryptData(xmlDoc.DocumentElement, sessionKey, false); 

2.

EncryptedXml.ReplaceElement(xmlDoc.DocumentElement, edElement, false); 

3.

private static string CompressStream(string data) 
     { 
      byte[] byteData = System.Text.ASCIIEncoding.ASCII.GetBytes(data); 
      byte[] compressedData = QuickCompression.Compress(byteData, CompressionMethod.Deflated, CompressionLevel.Highest); 
      return Convert.ToBase64String(compressedData); 
     } 

在第三部分,代碼可以拋出excep任何和灰線,但尤其是在第三行拋出這是

Convert.ToBase64String(compressedData); 

同時,我通過任務管理器同時運行的代碼檢查我的記憶中,似乎有很多的可用內存來使用!

我的假設是,即使在總的可用內存,沒有可用的內存足以容納字節數組大小的統一塊。

您對此有何看法?

如果我的假設是正確的,那麼

有沒有辦法迫使內存合併可用內存塊,以獲得較大的可用塊? 或 有什麼辦法,迫使我的代碼要等到足夠的可用內存,以適應字節數組大小統一塊?

如果我的假設是錯誤的,那麼 可以採取什麼問題嗎?

感謝

編輯

有一個名爲MemoryFailPoint類,它可以幫助我解決我的問題呢?

+2

如果您的代碼在進行多線程時失敗,嗯......這可能意味着您有多線程問題,而不是內存問題。檢查你的代碼的同步問題(包括像這個QuickCompression事件的3D派對),嘗試添加鎖等。 –

+0

嘗試分析你的內存使用情況(儘管不使用任務管理器)。這將有助於您確定內存是否是問題而不是猜測。正如Simon建議的那樣,您可能會遇到多線程問題。 – publicgk

+0

你的多線程代碼調用'CompressStream()'?如果是這樣,那麼通過使該方法是單線程的(例如,通過用'lock'保護它)你可能能夠解決這個問題。 –

回答

0

我想這是在Convert.ToBase64Stringnew string

我也許有類似的問題。用new string簡單地分配巨大的內存塊會拋出內存異常。在我的盒子(8 GB主內存)上,在170 MB以上。