我正在做一个项目,我需要在C#中处理和操作大型JSON数据集。但是,当处理包含数千条记录的文件时,我面临着性能问题。我可以使用哪些最佳实践和库来有效地处理C#中的大型JSON数据?在处理大型JSON文件时,有没有什么优化或技术可以提高处理速度和内存使用率?
kmbjn2e31#
你面临的问题是,你解析了大量的数据,并将它们存储在内存中,即使你只使用它们一次(或转换成其他东西)。根据输入数据和处理,您可以在这里使用两种方法。第一种是从I(Async)Escort流式传输数据。它要求根文档是一个数组。这是处理大数据的最简单方法。举个例子:
await foreach(var entry in JsonSerializer.DeserializeAsyncEnumerable<Entry>(stream)){ // process each entry.}
await foreach(var entry in JsonSerializer.DeserializeAsyncEnumerable<Entry>(stream))
{
// process each entry.
}
第二个是使用Utf8JsonReader。举个简单的例子:
Utf8JsonReader reader = new(data);if (!reader.Read() || reader.TokenType != JsonTokenType.StartArray) throw new JsonException();while (reader.Read()){ if(reader.TokenType == JsonTokenType.EndArray) { break; } if (reader.TokenType != JsonTokenType.StartObject) throw new JsonException(); var entry = JsonSerializer.Deserialize<Entry>(ref reader) ?? throw new JsonException(); //process entry}
Utf8JsonReader reader = new(data);
if (!reader.Read() || reader.TokenType != JsonTokenType.StartArray)
throw new JsonException();
while (reader.Read())
if(reader.TokenType == JsonTokenType.EndArray)
break;
if (reader.TokenType != JsonTokenType.StartObject)
var entry = JsonSerializer.Deserialize<Entry>(ref reader) ??
//process entry
请记住,使用Utf8JsonReader更复杂,因为它不支持直接从Stream中阅读。如果您正在处理的输入数据可以加载到内存中(即,可以用ReadOnlySpanlike byte[]表示),那么这可能不是问题,但是如果它的大小大于4 GB,那么您必须自己实现解析并处理EOF,因为存储如此大的字符串是另一个问题。Utf8JsonReader usage guide我通常使用System.Text.Json,但Newtonsoft.Json也可以做到这一点。一般来说,没有特定的技术可以减少内存或CPU的压力,因为库已经足够好了。
1条答案
按热度按时间kmbjn2e31#
你面临的问题是,你解析了大量的数据,并将它们存储在内存中,即使你只使用它们一次(或转换成其他东西)。根据输入数据和处理,您可以在这里使用两种方法。
第一种是从I(Async)Escort流式传输数据。它要求根文档是一个数组。这是处理大数据的最简单方法。举个例子:
第二个是使用Utf8JsonReader。举个简单的例子:
请记住,使用Utf8JsonReader更复杂,因为它不支持直接从Stream中阅读。如果您正在处理的输入数据可以加载到内存中(即,可以用ReadOnlySpanlike byte[]表示),那么这可能不是问题,但是如果它的大小大于4 GB,那么您必须自己实现解析并处理EOF,因为存储如此大的字符串是另一个问题。Utf8JsonReader usage guide
我通常使用System.Text.Json,但Newtonsoft.Json也可以做到这一点。
一般来说,没有特定的技术可以减少内存或CPU的压力,因为库已经足够好了。