2013-01-11 41 views
3

我正在從數據庫讀取二進制數據,並通過使用代碼將其轉換爲文本。如何將Encoding.GetString與大量數據一起使用? (拋出OutOfMemoryException)

 public String BinaryToText(byte[] data) 
     { 
     System.Text.Encoding encEncoder = System.Text.ASCIIEncoding.ASCII; 

     return encEncoder.GetString(data); 
     } 

上述過程正常工作,但是當二進制文件> = 85MB被轉換,OutOfMemoryException異常 是shown.How到較大的二進制數據轉換成字符串沒有錯誤。

+0

如何從文件讀取數據? –

+0

不,我正在從sqlserver讀取數據 – mck

+0

您似乎認爲ASCII對於「BinaryToText」足夠了......這是錯誤的,二進制文件的編碼可以用任何編碼。 – Esailija

回答

7

我通常不會期望85MB也是一個問題,除非你的內存不足等等。即使x86通常可以處理,而不會暫停呼吸。

對於大量數據,最簡單的答案總是「不要一次全部放在內存中」。 ADO.NET對數據讀取器轉發只API,允許連續調用來獲取大的BLOB的不同部分:

using(var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) 
{ //         ^^ forwards-only mode ^^ 
    long offset = 0; 
    int read; 
    byte[] buffer = new byte[8096]; 
    while ((read = reader.GetBytes(colIndex, offset, buffer, 0, buffer.Length))>0) 
    { 
    ProcessBytes(buffer, 0, read); 
    offset += read; 
    } 
} 

ProcessBytes(byte[] buffer, int offset, int count)其中處理從buffercount字節開始,offset。在ASCII的情況下,您可能可以在不使用編碼的情況下全部離開;對於其他編碼,您可以使用Encoding.GetDecoder() API來解碼數據流,儘管它有點麻煩。這兩件事合在一起將允許你處理一個任意大的(如果需要的話,多TB)數據源,而不一次全部存儲在內存中。

接下來的問題是:你打算用做什麼這個數據?

如果你需要一次在內存中,你有沒有選擇,但要舉行它。你可能能夠做一些迭代器塊,依次返回片段

相關問題