|
Segmentation Fault
|
|||
---|---|---|---|
#18+
Здравствуйте, уважаемые участники сообщества. Ситуация следующая. Имеется база данных 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. Под Windows обычно ошибка - out of memory - при том, что свободной памяти еще более чем достаточно (в том числе - в x64-софте, который теоретически может использовать все 16 гб памяти, которые у меня установлены). Видимо, это потому, что Windows не знает, что такое Segmentation Fault. Полей со значением NULL в базе нет. Большая просьба - подскажите, что я делаю не так и в какую сторону копать. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 19:42 |
|
Segmentation Fault
|
|||
---|---|---|---|
#18+
devspecSQLite работает примерно 4 часа, после чего неизменно выдает Segmentation Fault. Под Windows обычно ошибка - out of memory - при том, что свободной памяти еще более чем достаточно Если ты 100% уверен что проблема началась только после того как был добавлен FTS, и 1000% уверен что ничего кроме не добавлялось - тогда берешь другую версию SQLite, собираешь ее и надеешься что данная ошибка была исправлена (или еще не внесена если будешь брать более старую версию). Полистай список исправленных ошибок начиная от твоей версии и вплоть до текущей. Потом почитай багтрекер - может кто-то уже натыкался на подобное и скажет точно в какой версии ошибка возникла. Но 99.9% шансов за то, что ошибка в твоей собственной обвязке FTS. Добавил в свое приложение диалог использующий полнотекстовый поиск, ошибся в нем - все проблемы и начались. devspec (в том числе - в x64-софте, который теоретически может использовать все 16 гб памяти, которые у меня установлены). Видимо, это потому, что Windows не знает, что такое Segmentation Fault.Неправда. Винда прекрасно знает что такое нарушение сегментов, а на ошибку типа "не хватает памяти" количество реальной памяти никак не влияет. Сколько бы у тебя этой памяти ни было - всю можно захапать. А то что ты видишь в это время "пустую" память, так это винда врет - она выделяет некоторый кусок памяти для своих собственных нужд (в том числе и для ругани на нехватку памяти), но показывает эту память как свободную. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 22:23 |
|
Segmentation Fault
|
|||
---|---|---|---|
#18+
Пробовал на трех разных версиях SQLite, в том числе - на самой последней, доступной на сайте. Не совсем понимаю, что такое "обвязка FTS"... Базу я создал и наполнил незадолго до того, как начал пытаться создать ее полнотекстовый индекс, никакой другой работы с базой, кроме её наполнения данными, не производилось. В ней одна таблица 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 phrases_fts(phrases_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 на таких объемах данных. Теперь нужно только понять, что же делать дальше ) Может быть попробовать INSERT INTO docs_fts SELECT doc... from docs LIMIT 0,100000000 и вставлять, например, по 100 млн записей? Возможно, ошибка из-за чрезмерно большого объема данных? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 23:18 |
|
Segmentation Fault
|
|||
---|---|---|---|
#18+
Ошибся в посте, INSERT INTO phrases_fts(phrases_fts) VALUES ('rebuild') читать как INSERT INTO docs_fts(docs_fts) VALUES ('rebuild') , набирал по памяти ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2015, 23:20 |
|
Segmentation Fault
|
|||
---|---|---|---|
#18+
devspecНе совсем понимаю, что такое "обвязка FTS"... Ты сказал что падение происходит через четыре часа. Четыре часа чего? Что в эти четыре часа происходит? Только загрузка данных? Если да, то через что? Через какую программу? Вот эта программа скорее всего и глючит. devspecВ общем, моя совесть чиста - это, судя по всему, ошибка движка SQLite. Маловероятно, что разработчики тестировали SQLite на таких объемах данных. Теперь нужно только понять, что же делать дальше )Ну как я уже сказал: 1) Убедиться что проблема не в обвязке. 2) Попробовать другие версии движка 3) Сообщить о проблеме в багтрекере. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2015, 00:17 |
|
Segmentation Fault
|
|||
---|---|---|---|
#18+
4 часа отрабатывают те или иные команды INSERT в FTS-таблицу, которые я написал выше. Это занимает примерно одинаковое время во всех программах и во всех версиях SQLite. И после этого - Segmentation Fault. Я думал, что проблема на поверхности, поэтому в багтрекер пока не писал. Теперь понятно, что надо писать, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2015, 00:45 |
|
Segmentation Fault
|
|||
---|---|---|---|
#18+
Возможно из-за большого к-во записей. У меня было ~300 млн записей, но текстовое поле содержало больше "символов". Точно не помню как всё делал, но точно помню, что делал по частям. То есть создал БД с аналогичной структурой и переносил туда данные частями. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2015, 21:11 |
|
|
start [/forum/topic.php?fid=54&fpage=10&tid=2008687]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
27ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
2ms |
others: | 269ms |
total: | 382ms |
0 / 0 |