sphinx не хватает памяти.

KillDead

Хранитель порядка
Регистрация
11 Авг 2006
Сообщения
894
Реакции
579
Здравствуйте. Пытаюсь настроить сфинкс, Есть 2 базы , одна на 4 миллиона записей, вторая на 2. Выделено 8гигов памяти. Запускаю только один индекс (на 4) - работает нормально, если включаю сразу два, первый создаётся нормально второй крашится с ошибкой
WARNING: index 'index2': preload: mmap() failed: Cannot allocate memory (length=1734936233); NOT SERVING
Увеличение памяти до 16 гигов ничего не дало.
Так же дела обстоят с ротацией,
WARNING: rotating index 'index1': prealloc: mmap() failed: Cannot allocate memory (length=2186139320 is over 2GB, impossible on some 32-bit systems); using old index
Вообще у меня да, "i686 GNU/Linux" 32 битная система. Это значит что большие индексы поднять нельзя?
 
Походу только на 64 битную ось переходить. Странно что так много памяти кушает - покажи конфиг
 
Сфинкс висит в процессах и занимает 1100МБ . Вообще конфиг очень даже простой,
Код:
searchd
{
    listen            = 9312
    listen      = 3307:mysql41
    pid_file    = /etc/sphinxsearch/data/searchd.pid
    log         = /etc/sphinxsearch/data/log/log.txt
    query_log   = /etc/sphinxsearch/data/log/query_log.txt
    binlog_path = /etc/sphinxsearch/data/binlog/
}
common
    {
         lemmatizer_base = /local/sphinx/dicts/
    }

indexer
{
        # Максимальный лимит используемой памяти RAM
        mem_limit = 1500M
}



# Источник данных для поиска
source shop
{
    # Тип данных
    # Доступные типы: mysql, pgsql, mssql, xmlpipe, xmlpipe2, odbc
    type            = mysql

    # Необходимые параметры для подключения к базе данных
    sql_host        = localhost
    sql_user        = x
    sql_pass        = x
    sql_db        =  x
    sql_port        = 3306    # опциональный, по умолчанию 3306

   
    sql_query_pre        = SET NAMES utf8

    sql_query        = \
        SELECT id, name, search_text,  model, vendor\
        FROM table

        sql_field_string = name
        sql_field_string = search_text
        sql_field_string = model
        sql_field_string = vendor
  

}
index shop
{
     # Источник данных для индексирования
    source            = shop
    mlock = 0
    # Адрес, где будут хранится данные индекса
    path            = /etc/sphinxsearch/data/shop


    # Индекс с учетом морфологии
 
    morphology = lemmatize_ru_all, stem_en


    charset_table = 0..9, A..Z->a..z, _, a..z, \
    U+410..U+42F->U+430..U+44F, U+430..U+44F, U+401->U+0435, U+451->U+0435

    # хранить и оригинальное слово в индексе.
    index_exact_words = 1
 
    #Минимальный размер слова для индексации
    min_word_len =3
 
}
Индексы в папке /etc/sphinxsearch/data/shop занимает 3 гига.
Нашёл пару ответов Для просмотра ссылки Войди или Зарегистрируйся у чела 64 бита и всё равно ругается.
 
Вообще sphinx у меня несколько раз чудил. На последний релиз 2.2.10 не жалуюсь.
В конфигах, ничего криминального не вижу, единственное index_exact_words хорошо кушает память.
min_infix_len = 0 ("0" - это значение по-умолчанию если не выставлено), кучу гигабайт диска не должен забивать как при "2"
Что будет если index_exact_words исключить и поставить mem_limit = 256M?
 
Спасибо за ответ. Стоит как раз 2.2.10
mem_limit вообще никак не повлияло. Что 256M что 2000M
Пробовал разные настройки, ноль внимания.
В общем вроде как решил проблему - надо было тупо поставить 64 битную систему. Видимо расширение адресного пространства глючило.
Если и на 64х он начинает ругаться

WARNING: index '': preload: read error in /etc/sphinxsearch/data/xxx.sps (Bad address); 276627456 of 1734936233 bytes read; NOT SERVING

Значит памяти ему мало. Причём требует какое то большее кол-во для загрузки:
- индексы sps весят - по 2 гиг, вообще все файлы в папке /etc/sphinxsearch/data/ - 6 гигов, 12 гигов оперативки не хватило (система чистая, там ничего нету), добавил до 16 - загрузил нормально, В процессах остался searchd - 4000M. Нахрен ему такой простор в оперативке- не пойму. + если добавляете память обязательно нужно ребутать серв)
 
Попытка номер 2 - попробуй индексировать не сразу все результаты, а частями как в мане Для просмотра ссылки Войди или Зарегистрируйся

Код:
sql_query_range = SELECT MIN(id),MAX(id) FROM documents
sql_range_step = 1000
sql_query = (твой запрос) WHERE id>=$start AND id<=$end

Сейчас по логу мускула посмотрел - если не указывать такой лимит, идет сплошняком запрос, если указать лимит - то с лимитами.
Причем
43 тыс docs/sec - без лимитов
45-48 тыс docs/sec - с лимитами
хотя не могу ручиться за статистическую достоверность
 
Последнее редактирование:
Так конечно в память упрется, если запускать индексацию без ranged queries. Без них - сфинкс пытается загрузить сразу все строки из базы. А если база крупная - то логично что валится. У меня индексация идет по 10к строк, и без проблем индексируются таблицы на 18-20млн строк (общим весом 40-60гб). С достаточно большим количеством атрибутов, при этом - в памяти сфинкс жрет не более 4гб.
Мало того, в ранних версиях сфинкса - был еще такой параметр - как id64. т.е. 64 битные айдишки у документов. Не помню, в 2.2.10 включены они по умолчанию или нет.
 
Пытаюсь настроить сфинкс, Есть 2 базы , одна на 4 миллиона записей, вторая на 2. Выделено 8гигов памяти. Запускаю только один индекс (на 4) - работает нормально, если включаю сразу два, первый создаётся нормально второй крашится с ошибкой
С лимитами на sql-запрос нормально индексировалась база документов с 10 млн. записей. Время индексации кажется около 30 минут.
 
Здравствуйте. Пытаюсь настроить сфинкс, Есть 2 базы , одна на 4 миллиона записей, вторая на 2. Выделено 8гигов памяти. Запускаю только один индекс (на 4) - работает нормально, если включаю сразу два, первый создаётся нормально второй крашится с ошибкой
WARNING: index 'index2': preload: mmap() failed: Cannot allocate memory (length=1734936233); NOT SERVING
Увеличение памяти до 16 гигов ничего не дало.
Так же дела обстоят с ротацией,
WARNING: rotating index 'index1': prealloc: mmap() failed: Cannot allocate memory (length=2186139320 is over 2GB, impossible on some 32-bit systems); using old index
Вообще у меня да, "i686 GNU/Linux" 32 битная система. Это значит что большие индексы поднять нельзя?

очевидно, что дело не в памяти, установи все по-новой
 
Я думаю здесь лажа (простите за выражение) в запросе, а не с памяти. Вы посылаете в базу некорректный запрос
 
Назад
Сверху