Потоковая передача данных из базы данных в браузер в формате JSON через ASP.NET Core - PullRequest
0 голосов
/ 13 июня 2018

У меня есть API, который должен возвращать большие списки данных JSON.Я пытаюсь передать его прямо из базы данных клиенту, чтобы избежать перегрузки ОЗУ на моем веб-сервере.Это был бы хороший способ сделать это?(Кажется, работает)

[HttpGet]
[Route("data")]
public IEnumerable<MappedDataDto> GetTestData()
{
    var connection = new NpgsqlConnection(_connectionString);
    connection.Open();

    IEnumerable<RawDataDto> rawItems = connection.Query<RawDataDto>("SELECT * FROM sometable", buffered: true);

    foreach (var rawItem in rawItems)
    {
        var mappedItem = Map(rawItem);
        yield return mappedItem;
    }
}
  • Нужно ли разорвать соединение или об этом автоматически позаботятся?Я могу обернуть его в блок i using, так как при этом возникает исключение типа «невозможно получить доступ к удаленному объекту»
  • Было бы лучше использовать какой-либо поток вместо yield return?

РЕДАКТИРОВАТЬ: В моем случае у нас есть большое унаследованное веб-приложение на javascript, которое показывает графики и диаграммы данных между двумя датами.Клиент загружает весь набор данных и выполняет в памяти вычисления на клиенте для представления этих данных различными способами (пользователи могут создавать свои собственные пользовательские панели мониторинга, поэтому не все используют данные одинаково).

Наша проблема заключается в том, что, когда клиенты запрашивают период с большим количеством данных, потребление памяти нашим ASP.NET Core API значительно увеличивается.Так что это то, что мы пытаемся предотвратить.

К сожалению, внесение каких-либо более крупных изменений в клиент было бы очень трудоемким, поэтому мы смотрим на то, что мы можем вместо этого делать на стороне API.

Вот почему я пытаюсь выяснить, есть ли способ для потоковой передачи данных из базы данных через API.Так что на клиенте не должно быть никаких изменений, и использование API памяти не будет таким плохим, поскольку ему не придется хранить все в памяти.

1 Ответ

0 голосов
/ 14 июня 2018

Учитывая функциональность ( отображение данных в диаграммах / графиках ), я бы предложил некоторые изменения как для клиентского, так и для серверного приложения.

Давайте предположим, что такой сценарий случая:

Клиент запрашивает данные в течение 30 дней, что соответствует 1 миллиону строк

Это означает, что будет большой расход памяти не только на сервере, но и на сервере.клиентское приложение!Поэтому я бы предложил переписать запрос, чтобы сгруппировать данные по дням, часам или даже более короткому периоду времени , в зависимости от ваших потребностей - это уменьшит объем данных, отправляемых с сервера:

  • группировка по дням: 30 записей
  • группировка по часам: 720 записей
  • группировка по 10 минутам диапазон: 4320 записей
  • группировка по минутам: 43200 записей

Клиентскому приложению, очевидно, потребуются некоторые изменения для выполнения вычислений на основе сгруппированных данных, а не каждой отдельной строки.

Кстати, я не знаю, какая у вас RBDMSиспользуя, но это может быть полезно (SQL Server): Как группировать время по часам или по 10 минутам

...