У меня есть коллекция документов XML объемом 500 ГБ, которые я индексирую. В настоящее время я могу только индексировать 6 ГБ этой коллекции с 32 ГБ ОЗУ.Как сжать многие строки в структуре данных?
Моя индексная структура представляет собой HashMap<String, PatriciaTrie<String, Integer>>
, где первая строка представляет собой термин, а вторая строка имеет формат filepath+XPath
с конечным целым числом, представляющим количество вхождений.
Я использовал trie для сокращения общего префикса и потому, что мне нужны отсортированные данные. Это немного помогло с компрессией, но этого было недостаточно.
Общая коллекция строк filepath+XPath
находится между 1 ТБ и 4 ТБ в пределах этой структуры данных. Мне нужно иметь возможность полностью сжимать эту структуру данных в памяти. Целевая машина имеет 256 ГБ оперативной памяти и 16 ядер процессора. Меньше памяти имеет несколько дополнительных преимуществ (например, сокращение времени холодного запуска). Индексное время не такое уж большое дело.
XPaths представляют около 250 общих типов узлов.
Подход, над которым я сейчас работаю, построит таблицу Хаффмана для каждой серии из 2 тегов на основе тегов, которые могут произойти следующим образом. Часто это сокращает параметры до примерно 4 или 5, что позволяет кодировать XPath в гораздо более короткую битовую строку, которая затем может быть закодирована как байты.
Строки, как правило, 40-600 байт (UTF-8), и я считаю, что это должно уменьшить все после префикса пути к файлу (первые 40 символов, которые сжимаются trie) до max 12 байт (самый глубокий точка на дереве составляет около 12 узлов, а каждый узел в худшем случае представляет 1 символ) для структуры и 12 байтов для индексов (переменная байтовая кодировка с очень небольшим количеством элементов, содержащих индексы выше 256), производя строки, которые обычно в диапазоне 40-64 байта.
Я думаю, что это хороший подход, но я думаю, что мне что-то не хватает.
- Есть ли лучший способ сжатия этой структуры данных или данных, которые входят в нее?
- Как люди обычно сжимают много строк по одной и той же структуре данных?
- Есть ли существующее решение, которое сжимает многие строки независимо от всей коллекции?
- После того, как строки в структуре данных подобны этому, существуют ли какие-либо хорошие методы сжатия попыток, основанные на структуре, разделяемой между ними?
http://code.google.com/p/guava-libraries/ может иметь что-то полезное для работы с структурами данных, которые не могут вписаться в память. –