Почему JsonSerializer.DeserializeAsyncEnumerable используется для десериализации файла размером 1 ГБ, что приводит к выдC#

Место общения программистов C#
Anonymous
Почему JsonSerializer.DeserializeAsyncEnumerable используется для десериализации файла размером 1 ГБ, что приводит к выд

Сообщение Anonymous »

Мне нужно десериализовать json-файл размером 1 ГБ по одному элементу в потоковом режиме, и после некоторого чтения я нашел JsonSerializer.DeserializeAsyncEnumerable, чтобы включить это, сохраняя при этом немного низкое использование памяти. Я предположил, что это фактически будет означать, что использование памяти на самом деле не будет превышать размер одного объекта json в коллекции (возможно, немного больше для других процессов) и/или около размера буфера json, который по умолчанию составляет 4 МБ (настраиваемый). .
Однако после запуска следующего теста .NET 8 результаты оказались не такими, как я ожидал – почему во время этого процесса было использовано более 2 ГБ памяти – я совершенно неправильно понял, что должно быть происходит😖?

Код: Выделить всё

[MemoryDiagnoser(true)]
[Orderer(SummaryOrderPolicy.FastestToSlowest)]
[ShortRunJob]
public class DeserializationBenchmarks
{
[Benchmark]
public async Task StreamJsonAndDeserialize()
{
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };

var peopleJson = File.OpenRead("./peeps.json"); //1GB+
var people = JsonSerializer.DeserializeAsyncEnumerable
(peopleJson, options);

await foreach (var person in people)
{
await Console.Out.WriteLineAsync(person.Name);
}
await peopleJson.DisposeAsync();
}
}

// The json file is just an array of this simple Person object

public class Person
{
public string Id { get; set; }
public string Name { get; set; }
public string Language { get; set; }
public string Bio { get; set; }
public double Version { get; set; }
}
Изображение
Я пытался настроить размер буфера, но безуспешно, я также пытался обнулить каждый объект person после его десериализации, чтобы гарантировать, что он получит GC (возможно, бессмысленно) - я надеюсь десериализовать этот файл в более эффективное использование памяти


Подробнее здесь: https://stackoverflow.com/questions/787 ... a-1gb-file

Вернуться в «C#»