Как я могу передавать большой объем данных (более 50 ГБ) с помощью Newtonsoft?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу передавать большой объем данных (более 50 ГБ) с помощью Newtonsoft?

Сообщение Anonymous »

В настоящее время я работаю над давним проектом, в котором используется Newtonsoft.JSON. К сожалению, насколько мне удалось найти, эта библиотека не поддерживает асинхронную потоковую передачу.
Изначально мы планировали увеличить память сервера, чтобы вместить большие объемы возвращаемых данных. Однако вместо этого мы предпочитаем реализовать потоковый подход. Этот метод включает в себя запрос всех данных из базы данных, их пакетную обработку и возврат каждого пакета клиенту. Это хорошо работает до определенного размера (около нескольких ГБ, примерно 35 миллионов записей). Однако, как только мы превысим этот предел, я сталкиваюсь с ошибкой на клиенте: ответ завершился преждевременно. (Ответ закончился). Несмотря на это, все журналы сервера показывают, что приложение все еще работает и обрабатывает данные, а база данных и контейнеры работают нормально.
Учитывая, что для репликации проблемы требуется значительный объем данных , я пытаюсь определить, кроется ли проблема в коде или это ограничение Newtonsoft.JSON. В последнем случае может потребоваться переход на System.Text.Json (или другую альтернативу).
Код сервера:
[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();
}

Код клиента:
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
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... newtonsoft
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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