Является ли запрос по индексу с использованием вектора c ++ быстрее, чем запрос по ключу (индексу) в RocksDB или LevelDB?

Я думаю об использовании RocksDB или LevelDB для постоянного хранения моих данных для моей программы распознавания лиц. Прямо сейчас я использую вектор с ++, и он не является постоянным, что означает, что каждый раз, когда я перезагружаю свое программное обеспечение, мне приходится перезагружать данные в мой вектор. Мои данные содержат около 1 миллиона элементов, каждый из которых представляет собой вектор из 512 чисел с плавающей запятой. Скорость запросов имеет первостепенное значение, и в идеале мне нужна скорость запроса o (1) при запросе с индексом. Из моих исследований я не могу найти такой гарантии для RocksDB и LevelDB.

Мой вопрос: стоит ли вкладывать свои усилия в использование RocksDB или LevelDB или они медленнее, чем векторные?

0

Решение

Короткий ответ на вопрос о структуре индекса — «нет». RocksDB и LevelDB используют древовидную структуру для своих индексов (если быть точным, логически структурированное дерево слияния), которое преобразуется в O (log N) запросов.

Учитывая, что у вас есть фиксированное количество элементов фиксированного размера, вы можете довольно легко получить O (1), «запрашивая» самостоятельно.

Просто храните ваши данные в двоичном файле. Вы можете искать к соответствующей точке, используя istream::seekg, затем прочитайте 512 поплавков, используя istream::read,

struct record {
float data[512];
};

std::istream &read_record(istream &is, size_t record_number, record &r) {
auto read_start = record_number * sizeof(r);
is.seekg(read_start);
is.read(reinterpret_cast<char *>(r), sizeof(r));
}

Однако может возникнуть вопрос, действительно ли это обеспечивает улучшение производительности. В частности, учитывая только миллион элементов, бинарное дерево будет иметь глубину только около 20. Многостороннее дерево будет еще меньше. Для этого небольшого размера есть вероятность, что весь индекс будет постоянно находиться в памяти, а поиск небольшого дерева в памяти очень быстрый по сравнению даже с самым тривиальным дисковым вводом / выводом. Поиск по индексу вряд ли существенно повлияет на скорость чтения.

В то же время маловероятно, что использование БД будет легче писать, чем код, подобный описанному выше, и практически нет шансов, что он будет быстрее (хотя возможный что он может, например, обеспечить более эффективное кэширование, чем ваша ОС, чтобы он был быстрее при некоторых обстоятельствах).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]