Оптимизация размера DSL-словарей

Не секрет, что в интернете можно достать лучшие словари английского языка, причем даже с озвучкой и иллюстрациями. Среди них особо выделю словари издательств Longman и Oxford. Так вот, практически у всех DSL-словарей такого объема можно срезать пару сотен мегабайт.
Начну с того, что доступно относительно неопытному пользователю.
1. Самое простое действие -- это перевести кодировку из UTL-16LE в UTF-8, что сокращает размеры файлов практически вдвое (минус 100 мегабайт в случае с Oxford Advanced Learner's Dictionary 8th ed.) Lingvo такие файлы не переварит, а GoldenDict отлично с ними работает. Я рекомендую делать это в редакторе EditPad Lite 7, отлично показавшем себя при работе с большими файлами и, на мой взгляд, лучше и быстрее всех работающем с регулярными выражениями. Затем можно сжать DSL-файл DictZip'ом.
Дальнейшие действия потребуют навыков квалифицированного пользователя.
2. DSL-файлы нередко поддаются существенной оптимизации. В частности, можно удалять повторяющиеся пробельные символы, пробелы в конце строк, DSL-комментарии вида {{something}}, закрывающие теги [/m]. Кроме того, нередко встречаются словари с повторяющимися по несколько раз карточками (мне попадались такие, где одна карточка повторялась 3-4 раза).
Дальнейшая оптимизация возможна за счет удаления ненужных или неоптимальных тегов, но требует тщательного тестирования. Например, можно выкидывать теги , обрамляющие маркеры. В одном файле могут быть сотни тысяч маркеров, на каждом можно сэкономить 6 байт.
Большинство манипуляций я проводил регулярными выражениями либо в редакторе EditPad 7, либо запуская на локальной машине PHP, которому отвел не менее 2 гигабайт оперативной памяти (в частности, оптимизирующий DSL скрипт требует в 4,78 раз больше памяти, чем весит файл словаря).
3. Во многих словарях есть таблицы, выложенные в формате JPG. С таблицами неправильных глаголов я сделал следующее: сперва конвертировал в png с сокращением цветовой палитры до 4, удалением фона и обрезанием до границ таблички. Это делается через пакетную обработку в "Фотошопе". Затем получившиеся PNG-файлы скармливаются программе PNG Gauntlet, которая удаляет всю ненужную информацию. В результате таблицы стали не только занимать в 20-30 раз меньше места, но и выиграли в качестве! JPG можно пропустить через jpegtran.
Если нет желания разбираться с пакетной обработкой файлов в "Фотошопе" и бороться с его глюками -- можно просто сконвертировать JPG'и с табличками в PNG, который пропустить через PNG Gauntlet.
4. В таких словарях звуковые файлы, как правило, представлены в формате RIFF-WAV. WAV-файл -- это просто контейнер, в который "зашит" MP3. В начале и в конце сам MP3 обрамляется дополнительными чанками RIFF'а. Кроме того, в конце файла есть примерно 0,5 секунд тишины, которую можно вырезать, просто откусив у файла примерно 450 байт с конца. В результате на каждом из 118 тысяч звуковых файлов удалось выиграть примерно по 600 байт.
После таких манипуляций размер DSL-словаря сократился с 200 до примерно 90 мегабайт (а впереди еще сжатие DictZip'ом), размер архива с картинками и звуками -- с 584 до 364 мегабайт. Важно не забыть поменять в коде DSL-словаря разрешения файлов, чей формат вы заменили.
Начну с того, что доступно относительно неопытному пользователю.
1. Самое простое действие -- это перевести кодировку из UTL-16LE в UTF-8, что сокращает размеры файлов практически вдвое (минус 100 мегабайт в случае с Oxford Advanced Learner's Dictionary 8th ed.) Lingvo такие файлы не переварит, а GoldenDict отлично с ними работает. Я рекомендую делать это в редакторе EditPad Lite 7, отлично показавшем себя при работе с большими файлами и, на мой взгляд, лучше и быстрее всех работающем с регулярными выражениями. Затем можно сжать DSL-файл DictZip'ом.
Дальнейшие действия потребуют навыков квалифицированного пользователя.
2. DSL-файлы нередко поддаются существенной оптимизации. В частности, можно удалять повторяющиеся пробельные символы, пробелы в конце строк, DSL-комментарии вида {{something}}, закрывающие теги [/m]. Кроме того, нередко встречаются словари с повторяющимися по несколько раз карточками (мне попадались такие, где одна карточка повторялась 3-4 раза).
Дальнейшая оптимизация возможна за счет удаления ненужных или неоптимальных тегов, но требует тщательного тестирования. Например, можно выкидывать теги , обрамляющие маркеры. В одном файле могут быть сотни тысяч маркеров, на каждом можно сэкономить 6 байт.
Большинство манипуляций я проводил регулярными выражениями либо в редакторе EditPad 7, либо запуская на локальной машине PHP, которому отвел не менее 2 гигабайт оперативной памяти (в частности, оптимизирующий DSL скрипт требует в 4,78 раз больше памяти, чем весит файл словаря).
3. Во многих словарях есть таблицы, выложенные в формате JPG. С таблицами неправильных глаголов я сделал следующее: сперва конвертировал в png с сокращением цветовой палитры до 4, удалением фона и обрезанием до границ таблички. Это делается через пакетную обработку в "Фотошопе". Затем получившиеся PNG-файлы скармливаются программе PNG Gauntlet, которая удаляет всю ненужную информацию. В результате таблицы стали не только занимать в 20-30 раз меньше места, но и выиграли в качестве! JPG можно пропустить через jpegtran.
Если нет желания разбираться с пакетной обработкой файлов в "Фотошопе" и бороться с его глюками -- можно просто сконвертировать JPG'и с табличками в PNG, который пропустить через PNG Gauntlet.
4. В таких словарях звуковые файлы, как правило, представлены в формате RIFF-WAV. WAV-файл -- это просто контейнер, в который "зашит" MP3. В начале и в конце сам MP3 обрамляется дополнительными чанками RIFF'а. Кроме того, в конце файла есть примерно 0,5 секунд тишины, которую можно вырезать, просто откусив у файла примерно 450 байт с конца. В результате на каждом из 118 тысяч звуковых файлов удалось выиграть примерно по 600 байт.
После таких манипуляций размер DSL-словаря сократился с 200 до примерно 90 мегабайт (а впереди еще сжатие DictZip'ом), размер архива с картинками и звуками -- с 584 до 364 мегабайт. Важно не забыть поменять в коде DSL-словаря разрешения файлов, чей формат вы заменили.