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 просмотра
Решения вопроса 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 Автор вопроса
К сожалению, в самой базе это невозможно, так как это не наша база, а клиентов. Заводить отдельную коллекцию в нашей базе с этой метаинформацией можно, конечно, но уж очень накладно. Решили пока просто ограничивать размер выборки.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы