Задать вопрос
Ptolemy_master
@Ptolemy_master

Какую стратегию следует использовать в случае огромного объема данных?

Итак, имеется база MongoDB, на бакэнде NodeJs, подключение к базе через mongodb драйвер. Пользователю на фронте позволяется сделать любую выборку. Если объем данных слишком велик, node.js рушится со следующей ошибкой:

>> FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
>> Exited with code: 3.
>> Error executing child process: Error: Process exited with code 3.


Что можно сделать?
Вижу следующие подходы (в теории):
1) Как-то выяснить (как?) объем данных, которые будут возвращены в случае данного запроса, и, если он превышает определенный лимит, не выполнять запрос, а вернуть пользователю сообщение об ошибке.

2) Если это невозможно, то остановить выполнение запроса в процессе, и вернуть сообщение об ошибке.

3) Остается одно - иметь запущенным какой-то демон, который тут же перезапустит node если он рухнет.

Что посоветуете, спасибо!
  • Вопрос задан
  • 183 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 2
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
1. Вначале посчитать ТОЛЬКО КОЛИЧЕСТВО записей: COUNT
2. Для выборки с нужными данными использовать ограничение: LIMIT
Ответ написан
@RidgeA
1. count + размер документа в MongoDB не может превышать 16 мб https://docs.mongodb.com/manual/reference/limits/
2. mongodb.github.io/node-mongodb-native/2.0/tutorial... но смотри ниже
3. Демон в любом случае рекомендую иметь - pm2, nodemon, supervisor, supervisord, systemd...

С помощью mongodb.github.io/node-mongodb-native/2.0/tutorial... можно отдавать данные на клиент потоком, тут главное, что бы клиент схавал.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@SEOVirus
Ptolemy_master, может завести отдельный столбец, где указывать объём данных в столбце? Т.о. вы будете сказать сколько данных накапливается для вывода. И накапливать вывод до тех пор пока он не превышает порог.
Ответ написан
Комментировать
Ptolemy_master
@Ptolemy_master Автор вопроса
К сожалению, в самой базе это невозможно, так как это не наша база, а клиентов. Заводить отдельную коллекцию в нашей базе с этой метаинформацией можно, конечно, но уж очень накладно. Решили пока просто ограничивать размер выборки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы