簡體   English   中英

使用Json.NET反序列化大文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM