Hashmap в Node.JS для 350М+ объектов, что выбрать?
Пишу сервис на node.js, который обрабатывает большие объемы геоданных. В частном случае, есть массив точек, у каждой точки есть числовой id и координаты (lat, lng) и мне нужно быстро по id получить координаты. Первое, что пришло в голову, просто создать в памяти Object и добавлять туда значения, где ключ это id а значение - массив [lat, lng]. Проблема в том, что когда количество элементов в объекте переваливает за 9 миллионов то производительность резко падает, операция добавления становится все более долгой пока в конце концов все не стопарится. Нагуглил, что нодовские объекты, да и даже простые индексные массивы не предназначены для такого количества данных. Нашел в npm модуль, который реализовывает хэшмап на с++, автор обещал супер скорость и супер объемы, в реале либа так же начинала тормозить уже на 13 миллионе и чем дальше тем хуже. Оперативной памяти на машине хватает. Мне нужно сохранить порядка 350 миллионов записей. id точек это целые числа уже отсортированные по возрастанию.
Какой инструмент мне лучше использовать чтобы сохранить такой массив данных и в последующем быстро доставать их по id? Желательно без использования "тяжелой артиллерии" типа postgress или mongodb.
Redis подошел почти идеально, неудобство только в том, что значение он хранит только строковое, приходится каждый раз преобразовывать координаты в строку и обратно. Плюс к этому из-за строк использование оперативной памяти крайне не рационально. По это я написал свой сервис на Go, который хранит только нужный мне тип данных затрачивая всего 12 байт на запись (плюс определенный оверхед) и это работает хорошо.
Если есть возможность переиндексировать геоданные так, чтобы id лежал в диапазоне [0..N-1] - так и сделай. И храни свои [lat, lng] в массиве[0..N-1], лучше в двух: lat[0..N-1], lng[0..N-1]
Если нет - сохрани все отсортированные id в массиве, и при обращении по id бинарным поиском находишь его положение в массиве, а по нему выбираешь координаты из lat[0..N-1] и lng[0..N-1].
Может это с нодой какой-то косяк (использую v10.16.3 на Ubuntu 16.04) но как бы я не заполнял память, она не увеличивается до определенного момента, процессу дается максимум 1.5 - 1.6 Гб и дальше все, даже массив не заполнить. Пробовал заполонять несколько массивов, все равно дальше лимита все начинает дико тормозить. Видимо, придется использовать какое-то стороннее хранилище