2015-11-23 52 views
6

JSONファイルをデシリアライズして約1GBの問題が発生しました。私は、次のコードを実行すると、私はメモリ不足の例外のうちを取得:例外がNewtonsoft.Json - 大きなオブジェクトを直列化解除する際のメモリ不足例外

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

によってスローされます

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); 
    } 
    } 
} 

連載がうまく機能し、ここで私は

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(); 
    } 
}} 
を使用しているコードがあります

デシリアライズで何か問題がありますか?大きなjsonオブジェクトをデシリアライズする方法を提案する手助けができますか?

おかげ

+0

1)[あなたは、64ビットアプリケーションとして動作していることを確認してください](https://msdn.microsoft.com/en- us/library/ms241064%28v = vs.110%29.aspx)。 32ビットモードで実行している場合は、おそらくメモリが不足している可能性があります。 2)メモリ不足例外の完全なトレースバックは何ですか?あなたは 'JsonConverter'でメモリ不足になっていますか? – dbc

+0

私は32ビットアプリケーションを実行していますが、メモリ不足でdataObject = serializer.Deserializeという行を実行しています(jsReader);例外をスローする関数はNewtonsoft.Json.Linq.JTokenWriter.WriteValue(Int64値) – cmarlowe88

答えて

4

Newtonsoft.Json Performance Tipsあなたのアプローチによれば(あなたはストリームを経由して読み、それはあなたのファイルからの部分を作る必要があるため)動作するように持っています。あなたのコードがなぜ機能しないのか分かりません。

しかし、あなたは別のアプローチを試すことができ、それは次の記事で説明しました - Parsing Big Records with Json.NET

+0

オブジェクトに逆シリアル化されたおそらく1GBのJsonはメモリに「適合」しません –

関連する問題