У меня очень распространенная проблема создания индекса для массива строк в диске. Короче говоря, мне нужно сохранить позицию каждой строки в представлении на диске. Например, очень наивным решением будет массив индексов следующим образом:
uint64 idx [] = {0, 20, 500, 1024,..., 103434};
Говорят, что первая строка находится в положении 0, вторая - в позиции 20, третья - в позиции 500 и n-м в позиции 103434.
Позиции всегда являются неотрицательными целыми числами 64 бит в последовательном порядке. Хотя цифры могут меняться в зависимости от какой-либо разницы, на практике я ожидаю, что типичная разница будет находиться в диапазоне от 2 ^ 8 до 2 ^ 20. Я ожидаю, что этот индекс будет записан в память, а позиции будут доступны случайным образом (предположим равномерное распределение).
Я подумывал о написании собственного кода для выполнения какой-то дельта-кодировки блоков или другой более сложной кодировки, но есть так много разных компромиссов между скоростью кодирования/декодирования и пространством, что я бы предпочел получить рабочую библиотеку как отправной точкой и, возможно, даже соглашаться на что-то без каких-либо настроек.
Любые подсказки? Библиотека c была бы идеальной, но С++ позволял бы мне запускать некоторые исходные тесты.
Еще несколько деталей, если вы все еще следуете. Это будет использовано для создания библиотеки, подобной cdb (http://cr.yp.to/cdb/cdbmake.html) в верхней части библиотеки cmph (http://cmph.sf.net). Короче говоря, это для большой ассоциативной карты на основе только для чтения с небольшим индексом в памяти.
Поскольку это библиотека, у меня нет контроля над вводом, но типичный пример использования, который я хочу оптимизировать, имеет миллионы сотен значений, средний размер значения в диапазонах в несколько килобайт и максимальное значение при 2 ^ 31.
Для записи, если я не нахожу библиотеку, готовую к использованию, я намереваюсь реализовать дельта-кодирование в блоках из 64 целых чисел с начальными байтами, задающими смещение блока до сих пор. Сами блоки будут проиндексированы деревом, что даст мне время доступа O (log (n/64)). Есть слишком много других вариантов, и я бы предпочел не обсуждать их. Я действительно с нетерпением жду, чтобы использовать код, а не идеи о том, как реализовать кодировку. Я буду рад поделиться со всеми тем, что я сделал, когда у меня это получилось.
Я ценю вашу помощь и даю знать, если у вас есть какие-либо сомнения.