Использование Deepstream List для десятков тысяч уникальных значений

Интересно, хорошая или плохая идея использовать deepstream record.getList для хранения множества уникальных значений, например, электронных писем или любых других уникальных идентификаторов. Основная цель состоит в том, чтобы иметь возможность быстро ответить на вопрос, есть ли у нас, например, пользователь с таким электронным письмом (используется электронная почта) или другой записью по конкретному уникальному полю.

Я провел несколько экспериментов сегодня и получил две проблемы: 1) когда я попытался заполнить список несколькими тысячами значений, которые я получил

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory

и мой глубокий сервер отключился. Мне удалось это исправить, добавив больше памяти в процесс узла сервера с этим флагом

--max-old-space-size=5120

это выглядит не очень хорошо, но позволило мне составить список из более чем 5000 наименований.

2) Для моих тестов этого было недостаточно, поэтому я предварительно подготовил список из 50000 элементов и поместил данные непосредственно в таблицу rethinkdb и получил еще одну проблему при получении списка или его изменении:

RangeError: Maximum call stack size exceeded

Я смог исправить это с другим флагом:

--stack-size=20000

Это помогает, но я полагаю, что только одна из тех ошибок появляется в производстве, когда размер списка достигает правильного значения. Я не знаю, действительно ли это проблема nodejs, javascript, deepstream или rethinkdb. Это все в целом заставило меня думать, что я пытаюсь использовать Deepstream List неправильно. Пожалуйста, дайте мне знать. Заранее спасибо!

1 ответ

Решение

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

Тем не менее, есть две открытые проблемы Github для повышения производительности для очень длинных списков путем отправки более эффективных дельт и введения опции разбиения на страницы

Интересные результаты в отношении памяти, хотя, определенно то, что должно быть обработано более изящно. В то же время вы можете значительно повысить производительность, объединив обновления в одно:

var myList = ds.record.getList( 'super-long-list' );

// Sends 10.000 messages
for( var i = 0; i < 10000; i++ ) {
    myList.addEntry( 'something-' + i );
}

// Sends 1 message
var entries = [];
for( var i = 0; i < 10000; i++ ) {
    entries.push( 'something-' + i );
}

myList.setEntries( entries );
Другие вопросы по тегам