2015-11-23 15 views
6

Ich habe ein Problem deserializing eine JSON-Datei von etwa 1 GB. Wenn ich den folgenden Code ausführen bekomme ich eine Ausnahme aus der Erinnerung:Newtonsoft.Json - Nicht genügend Speicher Ausnahme beim Deserialisieren von großen Objekt

using (FileStream sr = new FileStream("myFile.json", FileMode.Open, FileAccess.Read)) 
{ 
    using (StreamReader reader = new StreamReader(sr)) 
    { 
    using (JsonReader jsReader = new JsonTextReader(reader)) 
    { 
     JsonSerializer serializer = new JsonSerializer(); 
     dataObject = serializer.Deserialize<T>(jsReader); 
    } 
    } 
} 

die Ausnahme von

Newtonsoft.Json.Linq.JTokenWriter.WriteValue(Int64 value) 

geworfen Die Serialisierung gut funktioniert, hier ist der Code ich

bin mit
using (StreamWriter reader = new StreamWriter("myFile.json")) 
{ 
    using (JsonReader jsWriter = new JsonWriter(reader)) 
    { 
     JsonTextWriter jsonWriter = new JsonTextWriter(jsWriter) { Formatting = Formatting.Indented }; 
     JsonSerializer ser = new JsonSerializer(); 
     ser.Serialize(jsonWriter, dataObject, dataObject.GetType()); 
     jsonWriter.Flush(); 
    } 
}} 

Mache ich bei der Deserialisierung etwas falsch? Können Sie einen Weg zur Deserialisierung eines großen JSON-Objekts vorschlagen?

Dank

+0

1) [Stellen Sie sicher, Sie werden als 64-Bit-Anwendung ausgeführt] (https://msdn.microsoft.com/en- us/library/ms241064% 28v = vs.110% 29.aspx). Wenn Sie im 32-Bit-Modus arbeiten, haben Sie wahrscheinlich gerade nicht genug Speicher. 2) Was ist die vollständige Rückverfolgung der Ausnahmebedingung? Geht dir in einem 'JsonConverter' der Speicher aus? – dbc

+0

Ich bin eine 32-Bit-Anwendung ausgeführt, und ich bin in den nicht genügend Arbeitsspeicher ausführen die Zeile ausgeführt dataObject = serializer.Deserialize (jsReader); und die Funktion, die die Ausnahme auslöst, ist Newtonsoft.Json.Linq.JTokenWriter.WriteValue (Int64-Wert) – cmarlowe88

Antwort

4

Nach Newtonsoft.Json Performance Tips Ihrem Ansatz hat (weil Sie über Stream gelesen und es soll Teil aus der Datei machen) zu arbeiten. Ich kann nicht herausfinden, warum dein Code nicht funktioniert.

Aber man kann einen anderen Ansatz versuchen, dass im nächsten Artikel beschrieben - Parsing Big Records with Json.NET

+0

Wahrscheinlich ein 1 GB JSerserialized in ein Objekt nicht im Speicher "passt" –

Verwandte Themen