F.59. shared_ispell — разделяемый словарь ispell #
Модуль shared_ispell
предоставляет разделяемый словарь ispell, то есть словарь, расположенный в общем сегменте памяти. В традиционной реализации ispell каждый сеанс инициализирует и загружает собственный экземпляр словаря, и на это уходит много ресурсов процессора и памяти.
Это расширение выделяет область памяти в разделяемом сегменте (вы должны выбрать его размер заранее) и загружает в неё словарь при первом использовании.
F.59.1. Функции #
Реализованные в модуле shared_ispell
функции перечислены в Таблице F.41.
Таблица F.41. Функции shared_ispell
F.59.2. Параметры GUC #
shared_ispell.max_size
(int
) #Определяет максимальный размер разделяемого сегмента. Это жёсткий предел; разделяемый сегмент нельзя расширить, поэтому нужно установить такой размер, чтобы в этом сегменте уместились все словари и при этом он не занимал лишний объём.
F.59.3. Использование словаря #
Этот модуль должен выделить область памяти в разделяемом сегменте. Поэтому добавьте в файл конфигурации следующие параметры (или отредактируйте текущие значения):
# загружаемые библиотеки shared_preload_libraries = 'shared_ispell' # объём разделяемой памяти shared_ispell.max_size = 32MB
Чтобы понять, сколько памяти вам действительно нужно, задайте сначала большое значение (например, 200 МБ) и загрузите все нужные вам словари. Затем воспользуйтесь функцией shared_ispell_mem_used()
и определите, сколько памяти на самом деле используется (и скорректируйте соответствующую переменную GUC shared_ispell.max_size
).
Не задавайте в точности полученное значение, оставьте небольшой резерв, чтобы вы могли перезагружать словари, не изменяя предел GUC max_size (что потребует перезапуска БД). Объёма в районе 512 КБ будет вполне достаточно.
Это расширение определяет шаблон shared_ispell
, используя который можно определять собственные словари текстового поиска. Например, вы можете сделать следующее:
CREATE TEXT SEARCH DICTIONARY english_shared ( TEMPLATE = shared_ispell, DictFile = en_us, AffFile = en_us, StopWords = english ); CREATE TEXT SEARCH CONFIGURATION public.english_shared ( COPY = pg_catalog.simple ); ALTER TEXT SEARCH CONFIGURATION english_shared ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, word, hword, hword_part WITH english_shared, english_stem;
Проверить полученную конфигурацию можно так:
SELECT * FROM ts_debug('english_shared', 'abilities'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-----------+-------------------------------+----------------+----------- asciiword | Word, all ASCII | abilities | {english_shared,english_stem} | english_shared | {ability} (1 row)
Вы также можете изменить существующую конфигурацию текстового поиска. Например, если у вас есть конфигурация public.english
, вы можете подключить к ней шаблон shared_ispell
:
ALTER TEXT SEARCH CONFIGURATION public.english ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, word, hword, hword_part WITH english_shared, english_stem;
F.59.4. Автор #
Томаш Вондра <tomas.vondra@2ndquadrant.com>
, Прага, Чешская республика