2016-09-20 121 views
4

我有一個嚴重的問題與「JsonConvert.SerializeObject」我需要序列化超過500,000字典記錄,以使序列化拋出以下錯誤; System.OutOfMemoryException的。我試圖在foreach中分別序列化每個鍵,值對,但它被鎖定。顯然這是一個優化問題,但我不知道從哪裏開始,線程要部分序列化? 這些函數適用於很少的值。 我的代碼:SerializeObject拋出System.OutOfMemoryException

string json = JsonConvert.SerializeObject(DatatableToDictionary(dt), Newtonsoft.Json.Formatting.Indented); 

public List<Dictionary<string, object>> DatatableToDictionary(DataTable dt, List<DataColumn> columns) 
{ 
    return dt.Rows.Cast<DataRow>().Select(
     r => columns.ToDictionary(c => c.ColumnName, c => r[c.ColumnName])).ToList(); 
} 
+0

也許你需要恢復到'JsonWriter'。 –

+0

罪魁禍首也可以是循環引用 – mmcrae

+1

最有可能的json字符串創建的總大小太大。你能展示你的字典和周圍類型的結構嗎?我能夠使用流,StreamWriter和JsonTextWriter輕鬆快速地將包含值的百萬字典鍵寫入json文件。 –

回答

4

當你正在處理大量的數據,可以將其流式傳輸到一個文件,以避免這一切在內存中一次。

var filePath = @"C:\somewhere.json"; 

using (var fs = File.Open(filePath, FileMode.CreateNew)) 
using (var sw = new StreamWriter(fs)) 
using (var jw = new JsonTextWriter(sw)) 
{ 
    var serializer = new JsonSerializer(); 
    serializer.Serialize(jw, dictionary); 
} 

這將一次序列化一個位,並避免在內存中有一個巨大的字符串。

+0

我現在就試試。 – gvivetapl

+0

是的,它工作正常,我想我必須讀取文件來檢索數據?因爲它是一個web api,就像我爲一個MVC應用程序做的一樣。有沒有辦法將信息存儲在緩存中而不是任何路徑? – gvivetapl

+0

是的,然後你讀取文件來獲取數據。讀它基本上是相反的過程。該文件基本上可以充當您的緩存。 – mason

相關問題