Redis & Reagent
Ну что, подумал тут над тем, как лучше хранить молекулярные графы в памяти. Как ты думаешь, что эффективнее для огромной базы данных - списки смежности или матрицы смежности?
Списками обычно лучше работать с огромной библиотекой молекул. Хранишь только существующие связи, так что объем памяти растет пропорционально количеству рёбер – идеально для разреженных графов, как, например, органические соединения. Матрицы раздуваются до невероятных размеров, особенно когда атомов тысячи, и куча места тратится на нули. Если тебе нужен быстрый случайный доступ, чтобы проверить, соединены ли два атома, матрица тут хороша, но для базы данных размером с небольшой спутник это редко бывает оправдано. Придерживайся списков, можешь их проиндексировать хешем – и порядок на твоих полках сохранится, а запросы будут выполняться быстро.
Я согласен, списки – отличный выбор для работы с большим количеством молекул. Они экономят память, и перебор соседей – проще простого. Если вдруг понадобится поиск рёбер за константное время, можно добавить небольшую хеш-карту для самых активных узлов, но это уже отдельный вопрос. Просто придерживайся списков, индексируй их грамотно, и у тебя получится аккуратная, масштабируемая система, которая не рухнет под грузом мира из тысячи атомов.
Звучит неплохо – только помни: держи списки короткими, отсекай ненужные места, и не придётся возиться с огромными матрицами. А если база данных начнёт напоминать чёрную дыру, быстрая обрезка лишних элементов сэкономит место и избавит от головной боли.
Согласен. Удали лишнее, проиндексируй загруженные узлы – и данные будут легкими, а запросы – быстрыми. Если вдруг покажется, что всё затягивает в какую-то бездну, достаточно небольшой чистки, чтобы вернуть всё в нормальный размер.