Я думаю об использовании RocksDB или LevelDB для постоянного хранения моих данных для моей программы распознавания лиц. Прямо сейчас я использую вектор с ++, и он не является постоянным, что означает, что каждый раз, когда я перезагружаю свое программное обеспечение, мне приходится перезагружать данные в мой вектор. Мои данные содержат около 1 миллиона элементов, каждый из которых представляет собой вектор из 512 чисел с плавающей запятой. Скорость запросов имеет первостепенное значение, и в идеале мне нужна скорость запроса o (1) при запросе с индексом. Из моих исследований я не могу найти такой гарантии для RocksDB и LevelDB.
Мой вопрос: стоит ли вкладывать свои усилия в использование RocksDB или LevelDB или они медленнее, чем векторные?
Короткий ответ на вопрос о структуре индекса — «нет». 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. Многостороннее дерево будет еще меньше. Для этого небольшого размера есть вероятность, что весь индекс будет постоянно находиться в памяти, а поиск небольшого дерева в памяти очень быстрый по сравнению даже с самым тривиальным дисковым вводом / выводом. Поиск по индексу вряд ли существенно повлияет на скорость чтения.
В то же время маловероятно, что использование БД будет легче писать, чем код, подобный описанному выше, и практически нет шансов, что он будет быстрее (хотя возможный что он может, например, обеспечить более эффективное кэширование, чем ваша ОС, чтобы он был быстрее при некоторых обстоятельствах).
Других решений пока нет …