如何在C#中有效地处理大型JSON数据?

cxfofazt  于 2023-10-21  发布在  C#
关注(0)|答案(1)|浏览(286)

我正在做一个项目,我需要在C#中处理和操作大型JSON数据集。但是,当处理包含数千条记录的文件时,我面临着性能问题。我可以使用哪些最佳实践和库来有效地处理C#中的大型JSON数据?在处理大型JSON文件时,有没有什么优化或技术可以提高处理速度和内存使用率?

kmbjn2e3

kmbjn2e31#

你面临的问题是,你解析了大量的数据,并将它们存储在内存中,即使你只使用它们一次(或转换成其他东西)。根据输入数据和处理,您可以在这里使用两种方法。
第一种是从I(Async)Escort流式传输数据。它要求根文档是一个数组。这是处理大数据的最简单方法。举个例子:

  1. await foreach(var entry in JsonSerializer.DeserializeAsyncEnumerable<Entry>(stream))
  2. {
  3. // process each entry.
  4. }

第二个是使用Utf8JsonReader。举个简单的例子:

  1. Utf8JsonReader reader = new(data);
  2. if (!reader.Read() || reader.TokenType != JsonTokenType.StartArray)
  3. throw new JsonException();
  4. while (reader.Read())
  5. {
  6. if(reader.TokenType == JsonTokenType.EndArray)
  7. {
  8. break;
  9. }
  10. if (reader.TokenType != JsonTokenType.StartObject)
  11. throw new JsonException();
  12. var entry = JsonSerializer.Deserialize<Entry>(ref reader) ??
  13. throw new JsonException();
  14. //process entry
  15. }

请记住,使用Utf8JsonReader更复杂,因为它不支持直接从Stream中阅读。如果您正在处理的输入数据可以加载到内存中(即,可以用ReadOnlySpanlike byte[]表示),那么这可能不是问题,但是如果它的大小大于4 GB,那么您必须自己实现解析并处理EOF,因为存储如此大的字符串是另一个问题。Utf8JsonReader usage guide
我通常使用System.Text.Json,但Newtonsoft.Json也可以做到这一点。
一般来说,没有特定的技术可以减少内存或CPU的压力,因为库已经足够好了。

展开查看全部

相关问题