Прежде всего, мы должны знать, на что похожи строки:
если «большинство строк - 4 буквы», а размер файла составляет 100 МБ, тогда
a) должно быть так много дубликатов, что, возможно, вам лучше хранить строки, которые не в массиве (особенно если вы можете игнорировать регистр), но это не даст вам их позицию в векторе.
b) Может быть, есть способ сжать с 8-разрядного ascii (при условии, что это действительно ASCII) (8X4 = 32) до, возможно, 20 бит (5x4), используя 5 бит на букву, и с некоторыми причудливыми работающими битами уменьшить размер вектора. Пожалуйста, запустите образец данных и посмотрите, сколько букв действительно есть в файлах, возможно, некоторые группы букв настолько многочисленны, что имеет смысл назначить им особое значение (из 32 опций в 8-битной последовательности). На самом деле, если я прав, если большинство слов можно преобразовать в 20-битное представление, то все, что нужно, это массив с 3 МБ для хранения всех слов и их количества слов - и для обработки> 4 символов отдельно (предполагается, что 3 байта достаточно для подсчета слов, что должно быть, может быть, достаточно 2 байта: может сделать его динамическим для использования в общей сложности 2 МБ)
в) другой хороший вариант, я думаю, кто-то другой сказал это выше, просто конкатенировать строку с буквами и запустить на ней компрессор, плохая вещь - загрузка процессора и временная память, которая, вероятно, нужна для сжатия / / распаковку. Кроме того, должно работать очень хорошо
d) если вы действительно хотите минимизировать количество оперативной памяти, возможно, вы хотите использовать свой диск: отсортируйте слова (вы можете использовать диск, если у вас недостаточно оперативной памяти), и создайте временный файл со словами один за другим , что бы сделать для последовательного доступа. Затем вы можете создать одноразовое древовидное представление слов с листьями, содержащими относительный адрес к словам в файле для произвольного доступа, и «сериализовать» его на диск. В конце концов, так как большинство слов имеют длину 4 символа, с 5 прыжками вы получите положение любой буквы в файле без использования оперативной памяти, так сказать. Вы также можете кэшировать в оперативной памяти первые 2 или 3 слоя дерева, которые будут легкими в оперативном режиме, чтобы уменьшить количество переходов до 2 или 3 прыжков для слов из 4 символов. Затем вы можете использовать небольшую оперативную память для кеширования наиболее часто используемых слов и делать все возможное, чтобы ускорить доступ.
уже довольно поздно, надеюсь, у меня есть смысл ...
оплаченный Спасибо за комментарии, ребята