[英]Deserializing large files using Json.NET
我試圖處理大量數據(〜1000個單獨的文件,每個文件〜30 MB),以便用作機器學習算法訓練階段的輸入。 用JSON格式化的原始數據文件,我使用Json.NET的JsonSerializer類反序列化。 在程序結束時,Newtonsoft.Json.dll引發“ OutOfMemoryException”錯誤。 有沒有辦法減少內存中的數據,還是我必須更改所有方法(例如切換到Spark等大數據框架)來解決此問題?
public static List<T> DeserializeJsonFiles<T>(string path)
{
if (string.IsNullOrWhiteSpace(path))
return null;
var jsonObjects = new List<T>();
//var sw = new Stopwatch();
try
{
//sw.Start();
foreach (var filename in Directory.GetFiles(path))
{
using (var streamReader = new StreamReader(filename))
using (var jsonReader = new JsonTextReader(streamReader))
{
jsonReader.SupportMultipleContent = true;
var serializer = new JsonSerializer();
while (jsonReader.Read())
{
if (jsonReader.TokenType != JsonToken.StartObject)
continue;
var jsonObject = serializer.Deserialize<dynamic>(jsonReader);
var reducedObject = ApplyFiltering(jsonObject) //return null if the filtering conditions are not met
if (reducedObject == null)
continue;
jsonObject = reducedObject;
jsonObjects.Add(jsonObject);
}
}
}
//sw.Stop();
//Console.WriteLine($"Elapsed time: {sw.Elapsed}, Elapsed mili: {sw.ElapsedMilliseconds}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex}")
return null;
}
return jsonObjects;
}
謝謝。
Newtonsoft並不是真正的問題。 您正在將所有這些對象讀入內存中的一個大列表。 到了讓您要求JsonSerializer
創建另一個對象的JsonSerializer
,它失敗了。
您需要從您的方法中返回IEnumerable<T>
, yield return
每個對象,並在調用代碼中對其進行處理,而無需將其存儲在內存中。 這意味着迭代IEnumerable<T>
,處理每個項目,並寫入磁盤或最終需要寫入的任何地方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.