2016-09-20 3 views
4

У меня есть серьезная проблема с «JsonConvert.SerializeObject». Мне нужно сериализовать более 500 000 записей словаря, чтобы сделать сериализацию, выдает следующую ошибку; System.OutOfMemoryException. Я попытался сериализовать каждую пару, пару значений отдельно в foreach, но она заблокирована. По-видимому, это проблема оптимизации, но я не знаю с чего начать, потоки сериализуются по частям? Эти функции отлично работают с несколькими значениями. Мой код:SerializeObject throws 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

Culprit также может быть круговыми ссылками – mmcrae

+1

Скорее всего, общий размер создаваемой строки json слишком велик. Можете ли вы показать структуру своего словаря и окружающих его типов? Я смог легко и быстро выписать миллион ключей словаря со значениями в json-файл, используя поток, StreamWriter и JsonTextWriter. –

ответ

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

Да, он отлично работает, я думаю, тогда я должен прочитать файл для извлечения данных? потому что это веб-api, как я делаю для приложения MVC. Есть ли способ хранить информацию в кеше, а не в каком-либо пути? – gvivetapl

+0

Да, тогда вы читаете файл для получения данных. Чтение это в основном обратный процесс. Файл может в основном действовать как ваш кэш. – mason

Смежные вопросы