Wie kann ich mit Newtonsoft eine große Datenmenge (50+ GB) streamen?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie kann ich mit Newtonsoft eine große Datenmenge (50+ GB) streamen?

Post by Anonymous »

Ich arbeite derzeit an einem langjährigen Projekt, das Newtonsoft.JSON nutzt. Soweit ich weiß, unterstützt diese Bibliothek leider kein asynchrones Streaming.
Ursprünglich hatten wir geplant, den Speicher des Servers zu erhöhen, um die großen Datenmengen aufzunehmen, die wir zurückgeben müssen. Wir bevorzugen jedoch stattdessen die Implementierung eines Streaming-Ansatzes. Bei dieser Methode werden alle Daten aus der Datenbank abgefragt, stapelweise verarbeitet und jeder Stapel an den Client zurückgegeben. Dies funktioniert bis zu einer bestimmten Größe (ca. mehrere GB, ca. 35 Millionen Datensätze) gut. Sobald wir diesen Grenzwert jedoch überschreiten, tritt auf dem Client der Fehler auf: Die Antwort wurde vorzeitig beendet. (ResponseEnded). Trotzdem weisen alle Serverprotokolle darauf hin, dass die Anwendung noch läuft und Daten verarbeitet und die Datenbank und Container normal funktionieren.
Angesichts der Tatsache, dass eine erhebliche Datenmenge erforderlich ist, um das Problem zu reproduzieren Ich habe Schwierigkeiten festzustellen, ob das Problem im Code liegt oder ob es sich um eine Einschränkung von Newtonsoft.JSON handelt. Im letzteren Fall ist möglicherweise ein Übergang zu System.Text.Json (oder einer anderen Alternative) erforderlich.
Servercode:

Code: Select all

[AcceptVerbs("POST", Route = "stream")]
public async Task StreamAsync([FromBody] Request request)
{
await using var sw = new StreamWriter(Response.Body, leaveOpen: true);
await foreach (var response in StreamDataAsync(request))
await StreamResponse(sw, response); // returns approximately 20k records at a time
}

private async Task StreamResponse(StreamWriter sw, object response)
{
await sw.WriteLineAsync(JsonConvert.SerializeObject(response));
await sw.FlushAsync();
}
Kundencode:

Code: Select all

try
{
using (var response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
{
response.EnsureSuccessStatusCode();
using (var stream = await response.Content.ReadAsStreamAsync())
using (var reader = new StreamReader(stream))
{
string streamedResponse = null;
while ((streamedResponse = await reader.ReadLineAsync()) != null)
{
results.Add(JsonSerializer.Deserialize(streamedResponse));
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message); // Response Ended Prematurely Here
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post