Получение миллионов записей с MariaDB, Sequelize & Node.js для отображения в DevExtreme PivotGrid - PullRequest
2 голосов
/ 16 января 2020

Название уже подытоживает.

В настоящее время я сталкиваюсь с этой задачей: оператор SELECT приводит к 3,6 миллионам записей со многими столбцами. Этот полный пакет данных должен быть отправлен клиенту, чтобы браузер мог отображать все в сводной сетке. Таким образом, разбиение на страницы, к сожалению, не вариант.

Используется стек MariaDB, Node.js v8.11.3, Sequelize v3 и DevExtreme на стороне клиента.

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

Я был бы очень признателен за любую идею, как это можно реализовать, или если у вас есть опыт решения такой задачи, и вы пришли к выводу, что это невозможно сделать с помощью веб-приложения, пока.

Большое спасибо и хорошего дня!

Патрик

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Чтобы ответить на ваш вопрос: ВЫ НЕ МОЖЕТЕ.

Предоставление огромных наборов данных непосредственно клиенту, как правило, плохая идея. Представьте, что для вашего примера данные составляют 1 КБ на строку, вы будете загружать 3 ГБ данных. Это большое количество данных должно быть отправлено по сети, поэтому либо серверу / клиенту не хватит памяти, либо, если нет проблем, будет мучительно медленная загрузка и последующее использование.

Простого решения нет Решение здесь, но вы можете избежать отправки такого большого количества данных, переосмыслив, как эти данные существуют сейчас, чтобы отправить только агрегацию этих данных, или используя клиентскую библиотеку, которая использует разбиение на страницы (сводная таблица dev express не делает этого).

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

1 голос
/ 17 января 2020

3,6 миллиона строк. Предположим, что каждая строка содержит 128 байт данных, что составляет 460 800 000 байт - 439 МБ необработанных данных, которые вы пытаетесь выбрать, что не звучит очень плохо. Но эти данные будут обернуты в объекты / модели / превращены в json, так что ваше требование к памяти получается, по крайней мере, примерно в десять раз. 4.3Гб .

Хорошо, все еще не так уж плохо. Теперь нам нужно добавить sh в браузер, стилизовать его, обернуть в html, json и c ... Мы собираемся сделать pu sh примерно 1.4GB в json клиенту. клиент скачивает счастливо. json находится в браузере. Это превращается в объект. Памяти раз 4 примерно. 5.6GB . Не слишком потрепанный, но браузер справится, потому что у него есть ограничение памяти 256 МБ на вкладку ( Я сталкивался с этим при кодировании игры, будет варьироваться в зависимости от браузера ).

Но допустим, что это собственный неограниченный браузер, который может просто сделать это Итерация по json и создание электронной таблицы, такой как отображение, создание всех узлов DOM, присоединение их к дереву DOM, присоединение обработчиков событий и т. Д. c .. Время памяти 20: 112GB .

Таким образом, у клиента есть большая игровая установка с невероятным количеством оперативной памяти, браузер, который может обрабатывать адресные пространства, и операционная система. с этим можно справиться. Теперь вы попадаете на забавную территорию пейджинга. ОС должна постраничать в этой оперативной памяти, потому что слишком много остается неиспользованным, а ОС имеет задачи с более высоким приоритетом для запуска, пока пользователь смотрит на экран. Никакая микросекунда не остается неизрасходованной. Пишите в dis c, читайте из dis c при каждой прокрутке, убивая жесткий диск вашего клиента.

Короче говоря, браузер не допустит этого, потому что у него есть ограничение памяти. Объясните вашему клиенту, что он хочет, требует настраиваемой ОС, настраиваемого браузера, настраиваемого компьютера и все равно будет медленным из-за ограничений процессора

Просто делайте то, что делает Google Docs, загружайте по мере необходимости. Когда пользователь прокручивает, загружает необходимые данные дисплея, не больше и не меньше, и выгружает данные, которые не отображаются на экране, в течение 5 минут, чтобы оставаться ниже предела 256MB . Когда у вас есть готовый запрос, это просто вопрос установки смещения и ограничения количества результатов, которые вы хотите. Все остальное работает так же.

Реальный мир имеет ограничения, а ваши клиенты не желают. Приведите их в равновесие.

...