Задать вопрос
devspec
@devspec
Помогло? Отметь решением

Как избежать Segmentation Fault при попытке построения FTS-индекса на больших данных SqLite?

Здравствуйте, уважаемые участники сообщества.

Ситуация следующая.
Имеется база данных SQLite с примерно 3-мя миллиардами записей. Каждая запись - это некое поле типа CHAR и ряд дополнительных полей с различными типами. Размер файла - около 340 гб. Максимальная длина контента в поле doc - 256 симв, контент на русском языке.
Я пытаюсь создать полнотекстовый индекс и получаю ошибку Segmentation Fault.
Пытался я его создать различными способами, как под Windows (с помощью SQLite Expert и своего софта на .NET, в т.ч. c архитектурой x64), так и под Linux (как Ubuntu, так и Centos). Даже скомпилировал sqlite из исходников, включив необходимые флаги для FTS3 и FTS4 - ошибка одна и та же.

Пробовал два варианта
- contentless FTS4 - это когда контент хранится в обычной таблице, а в FTS-таблице хранится только индекс (create virtual table docs_fts using fts4(content='docs'... )
- второй вариант - создать полноценную FTS-таблицу из обычной - insert into docs_fts select doc... from docs;

SQLite работает примерно 4 часа, после чего неизменно выдает Segmentation Fault.
Полей со значением NULL в базе нет.

Пробовал на трех разных версиях SQLite, в том числе - на самой последней, доступной на сайте.
Базу я создал и наполнил незадолго до того, как начал пытаться создать ее полнотекстовый индекс, никакой другой работы с базой, кроме её наполнения данными, не производилось. В ней одна таблица docs, гарантированно не содержащая NULL-значений. Тоже думал, что, возможно, что-то с базой, сделал Reindex и Vacuum - Reindex происходит моментально, Vacuum происходит, хоть и долго, но успешно.
Грубо говоря мои действия:

CREATE TABLE docs ([id] INTEGER PRIMARY KEY AUTOINCREMENT, [doc] CHAR... (тут другие поля)
(тут действия по наполнению базы данными - они загружаются моим собственным скриптом из текстовых файлов)

CREATE VIRTUAL TABLE docs_fts using fts4 (content='docs', doc... (тут другие поля)
(тут попытка INSERT INTO docs_fts(docs_fts) VALUES ('rebuild') дабы перестроить contentless FTS index)

или

CREATE VIRTUAL TABLE docs_fts using fts4 (doc... (тут другие поля)
(тут попытка INSERT INTO docs_fts SELECT doc... from docs;)

или

CREATE VIRTUAL TABLE docs_fts using fts3 (doc... (тут другие поля)
(тут попытка INSERT INTO docs_fts SELECT doc... from docs;)

Для каждой попытки делал новую копию исходного файла, т.к. подозревал, что база могла нарушиться после Segmentation Fault.
Даже поменял планки памяти на другие - опасался, что, возможно, память глючная.

После всех попыток результат один - Segmentation Fault.

В баг-трекер SQLite инфу отправил, жду реакции. Однако, хотелось бы ответа и здесь - возможно, я что-то делаю неправильно (за исключением того, что, как минимум, странно такое количество информации хранить в SqLite))))

Спасибо.
  • Вопрос задан
  • 462 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы