SASGIS - SAS.Планета
View Issue Details
0003101SAS.Планета[All Projects] Багpublic05-07-2016 17:3802-08-2016 10:03
gma 
zed 
normalmajorhave not tried
resolvedfixed 
Windows7Enterprise
160707 
181221181221 
0003101: Отказ в конвертации кэша в SQLite из-за проблем с памятью
Оперативки в машине 32Гб. Была запущена конвертация кэша из GMT в SQlite. Кэш "весит" немногим больше 130Гб, на диске есть место. NTFS. В некий момент конвертация остановилась, в логе пошли ошибки, появилась надпись про невозможность работы, точно не помню. Перезапустил процесс заново, появилась приложенная картинка. Лог размером 1,3Гб -- весь не покажу, но вот несколько крайних записей:
2 0 1 6 - 0 7 - 0 5 1 5 : 0 2 : 2 9 . 7 3 1 ( i n i t ) 3 . 1 3 . 0 a t E : \ S A S P l a n e t \ s q l i t e 3 . d l l
 
 2 0 1 6 - 0 7 - 0 5 1 5 : 0 2 : 2 9 . 7 3 1 ( i n i t ) o u t o f m e m o r y ( e r r o r c o d e : 7 )
 
 2 0 1 6 - 0 7 - 0 5 1 5 : 0 2 : 2 9 . 7 3 1 ( i n i t ) 3 . 1 3 . 0 a t E : \ S A S P l a n e t \ s q l i t e 3 . d l l
 
 2 0 1 6 - 0 7 - 0 5 1 5 : 0 2 : 2 9 . 7 3 1 ( i n i t ) o u t o f m e m o r y ( e r r o r c o d e : 7 )
 
 2 0 1 6 - 0 7 - 0 5 1 5 : 0 2 : 2 9 . 7 3 1 ( i n i t ) 3 . 1 3 . 0 a t E : \ S A S P l a n e t \ s q l i t e 3 . d l l
 
 2 0 1 6 - 0 7 - 0 5 1 5 : 0 2 : 2 9 . 7 3 1 ( i n i t ) o u t o f m e m o r y ( e r r o r c o d e : 7 )
 
 
SQLite
has duplicate 0003113closed vdemidov Во время конвертации кеша "Can't alocate the DIB handle." 
png outof.png (27,802) 05-07-2016 17:38
http://www.sasgis.org/mantis/file_download.php?file_id=2087&type=bug
png

png cant.png (17,526) 06-07-2016 06:23
http://www.sasgis.org/mantis/file_download.php?file_id=2088&type=bug
png

zip sqlite.zip (223,508) 06-07-2016 11:01
http://www.sasgis.org/mantis/file_download.php?file_id=2089&type=bug
zip files.zip (1,375) 06-07-2016 11:24
http://www.sasgis.org/mantis/file_download.php?file_id=2090&type=bug
zip SASPlanet.Debug.zip (7,307) 06-07-2016 17:09
http://www.sasgis.org/mantis/file_download.php?file_id=2091&type=bug
rar sqlite2.rar (1,616,026) 06-07-2016 17:09
http://www.sasgis.org/mantis/file_download.php?file_id=2092&type=bug
png outom.png (19,078) 08-07-2016 05:42
http://www.sasgis.org/mantis/file_download.php?file_id=2093&type=bug
png

png bd.png (18,440) 12-07-2016 18:07
http://www.sasgis.org/mantis/file_download.php?file_id=2096&type=bug
png
Issue History
05-07-2016 17:38gmaNew Issue
05-07-2016 17:38gmaFile Added: outof.png
06-07-2016 06:23gmaFile Added: cant.png
06-07-2016 06:24gmaNote Added: 0017495
06-07-2016 06:25gmaTag Attached: SQLite
06-07-2016 07:41zedNote Added: 0017496
06-07-2016 07:59vdemidovStatusnew => feedback
06-07-2016 11:01gmaFile Added: sqlite.zip
06-07-2016 11:07vdemidovStatusfeedback => new
06-07-2016 11:23gmaNote Added: 0017503
06-07-2016 11:24gmaFile Added: files.zip
06-07-2016 17:07gmaNote Added: 0017504
06-07-2016 17:09gmaFile Added: SASPlanet.Debug.zip
06-07-2016 17:09gmaFile Added: sqlite2.rar
06-07-2016 17:11gmaNote Edited: 0017504bug_revision_view_page.php?bugnote_id=17504#r7026
08-07-2016 05:41gmaNote Added: 0017505
08-07-2016 05:42gmaFile Added: outom.png
09-07-2016 09:28zedSummaryотказ в конвертации кэша в sqlite из-за проблем с памятью => Отказ в конвертации кэша в SQLite из-за проблем с памятью
09-07-2016 09:28zedStatusnew => confirmed
09-07-2016 09:28zedTarget Version => 181221
09-07-2016 09:30zedNote Added: 0017506
12-07-2016 18:06gmaNote Added: 0017509
12-07-2016 18:07gmaFile Added: bd.png
13-07-2016 03:23zedNote Added: 0017510
13-07-2016 06:10gmaNote Added: 0017514
13-07-2016 06:22vdemidovNote Added: 0017515
13-07-2016 06:22zedNote Added: 0017516
21-07-2016 16:19aflexusNote Added: 0017537
21-07-2016 16:53aflexusNote Edited: 0017537bug_revision_view_page.php?bugnote_id=17537#r7034
21-07-2016 17:33vdemidovRelationship addedhas duplicate 0003113
22-07-2016 13:15zedNote Added: 0017553
27-07-2016 21:46aflexusNote Added: 0017562
27-07-2016 21:48aflexusNote Edited: 0017562bug_revision_view_page.php?bugnote_id=17562#r7044
28-07-2016 05:25zedNote Added: 0017563
01-08-2016 13:16zedNote Added: 0017577
01-08-2016 13:21zedAssigned To => zed
01-08-2016 13:21zedStatusconfirmed => feedback
01-08-2016 13:37zedNote Added: 0017578
02-08-2016 06:06gmaNote Added: 0017581
02-08-2016 06:06gmaStatusfeedback => assigned
02-08-2016 09:09zedStatusassigned => resolved
02-08-2016 09:09zedFixed in Version => 181221
02-08-2016 09:09zedResolutionopen => fixed
02-08-2016 10:03vdemidovProduct Version.Nightly => 160707

Notes
(0017495)
gma   
06-07-2016 06:24   
> надпись про невозможность работы -- cant.png
(0017496)
zed   
06-07-2016 07:41   
Попробуйте заархивировать лог, и если он получится не очень большой, прислать его мне. Возможно, там будет что-то интересное. Затем, удалите его и запустите дебажную версию.

В SQLite кэше что-то успело создаться? Сколько файлов там и какого размера? Файлы только с раcширением *.sqlitedb или есть и другие (и много ли их, если есть)?
(0017503)
gma   
06-07-2016 11:23   
> Попробуйте заархивировать лог -- sqlite.zip. Это следующий лог. первый потёрся самой программой, когда я запустил повторную конвертацию. Стабильно доходит до 15 уровня и затыкается. Внутри зипа есть кусочек старого лога (err10-07.txt) в месте перехода от ошибка10 к ошибка07. До этого с двух часов ночи была ошибка10. Переключение между номерами ошибок произошло после нажатия на Ок в окне "can't". Больше ничего интересного там не было.

> В SQLite кэше что-то успело создаться? -- да создались папки:
z2\
z11\
z12\
z13\
z14\
z15\
внутри созданы файлы трёх видов (files.txt). Все файлы *.sqlitedb-wal пустые (0), Все *.sqlitedb-shm равны 32кб и забиты нулями.
(0017504)
gma   
06-07-2016 17:07   
(edited on: 06-07-2016 17:11)
Запустил дебажку. она поработала пару часов и точно так же отвалилась. Выключал через диспетчер. Одновременно работал GM и памяти оставалось около 8 Гб. Соотв. отвалилась раньше.

(0017505)
gma   
08-07-2016 05:41   
Попробовал на свежей "стабильной" (с) версии 160707 запустить этот процесс через "Операции--скопировать". Получилось то же самое (outom.png) Логи этого процесса не создавались.
(0017506)
zed   
09-07-2016 09:30   
Проблема в том, что не контролируется количество соединений с БД и они, открываясь, никогда не закрываются. Нужно переделывать механизм открытия соединений и делать ограниченный по размерам пул.
(0017509)
gma   
12-07-2016 18:06   
Могу создать новый инцидент, но мне кажется, они как-то связаны "bd.png"
(0017510)
zed   
13-07-2016 03:23   
Очевидно, если SQLite кэш выжрал всю доступную память, то ни Беркли ни всё остальное не сможет нормально работать, поэтому, да, эти ошибки связаны.
(0017514)
gma   
13-07-2016 06:10   
Вся! память не выжирается. Съедается всего 3,5Гб т.к. прога 32-битная, и на этом всё кончается. Но конвертация в беркли была запущена на вновь открытой программе и вроде бы не должна быть напрямую связана с предыдущей ошибкой. Я предполагаю связь внутреннюю -- в алгоритмах конвертации или в отношениях с памятью...
(0017515)
vdemidov   
13-07-2016 06:22   
> Вся! память не выжирается. Съедается всего 3,5Гб

Ого, а вы в курсе, что 32-битной проге, без дополнительных ухищрений доступно только 2 Гб, а с некоторыми костылями 3 Гб на 32-битной винде и 4 ГБ на 64-битной. Более того, даже наличие свободной памяти не гарантирует что нужное количество памяти можно выделить. Память может быть сильно фрагментирована.
(0017516)
zed   
13-07-2016 06:22   
Сообщение об ошибке даёт ясно понять, что процессу не хватает памяти. Что вы пытались сделать с кэшем Беркли? И как к этому был причастен кэш SQLite?

Рекомендую дождаться когда этот баг в SQLite будет исправлен и тестировать уже потом.
(0017537)
aflexus   
21-07-2016 16:19   
(edited on: 21-07-2016 16:53)
> Проблема в том, что не контролируется количество соединений с БД и они, открываясь, никогда не закрываются. Нужно переделывать механизм открытия соединений и делать ограниченный по размерам пул.

А в беркли закрываются?

Кстати, скорость конвертации из обычного кеша в sqlite просто ракета, если сравнивать с berkley. Неужели последний настолько медленный?

(0017553)
zed   
22-07-2016 13:15   
> А в беркли закрываются?
Да, закрываются и ограничены 32-мя штуками (можно изменять через конфиг).

> Неужели последний настолько медленный?
Его пришлось сильно затормозить, т.к. были проблемы с повреждением БД. Возможно страдает моя реализация, а возможно ещё что. Если есть мысли, как можно сделать кэш быстрее (не повредив его устойчивости), высказывайте свои мысли, буду рад обсудить.
(0017562)
aflexus   
27-07-2016 21:46   
(edited on: 27-07-2016 21:48)
Средняя скорость конвертации sas->bdb 20 тайлов в секунду... Что-то явно не так ибо совсем не стыкуется с описанием bdb:

"BerkeleyDB can be extremely fast - I recently designed a built a data analysis platform for an employer that was capable of doing 40k inserts per second on an 8 core x86 system (while at the same time doing thousands of reads per second) with a dataset in the 30G range. This was with full transactional protection" - http://stackoverflow.com/questions/2824135/how-fast-is-berkeley-db-sql-compared-to-sqlite

http://www.oracle.com/technetwork/products/berkeleydb/berkeley-db-perf-128909.pdf

http://highscalability.com/blog/2012/11/29/performance-data-for-leveldb-berkley-db-and-bangdb-for-rando.html

А где можно код посмотреть? Я, конечно, навряд ли чем буду полезен, но мало ли .

(0017563)
zed   
28-07-2016 05:25   
Не стоит засорять этот тикет вопросами про Беркли. На форуме есть специальный топик: Использование в Sas.Планета кеша в формате Berkeley

Код у нас лежит в репозитории, а кэш Беркли вот в этой папке: /Src/TileStorage/BerkeleyDB/
(0017577)
zed   
01-08-2016 13:16   
Я ошибся, соединения всё таки закрываются. Но вот количество открытых никак не контролируется и до того, как сработает очистка мусора (раз в 3 минуты), можно успеть открыть очень много соединений.

Но это цветочки, а вот ягодки: задан очень большой размер кэша в памяти (60 000 страниц) для одного файла БД. Учитывая, что размер одной страницы обычно равен 4 кБ, то SQLite разрешено кэшировать в памяти 4 * 60000 = 240 Мб (!) на один файл. Т.е. чтобы выжрать всю память, достаточно активно писать в 5-6 файлов БД.

По-умолчанию, в SQLite кэшируется 2000 страниц (8 Мб на файл), протестируйте с этим значением. Для этого, закройте SAS и в папке с кэшем для карты, в которую идёт запись (например, /cache_sqlite/sat/), создайте текстовый файл s.sql вот с таким содержимым:

PRAGMA encoding="UTF-8"
PRAGMA cache_size=2000
PRAGMA main.journal_mode=WAL
PRAGMA synchronous=NORMAL

И попробуйте запустить конвертер кэша, а потом отпишитесь сюда.

В ночнушке же, я, пожалуй, уменьшу время сборки мусора до 1 минуты и размер кэша до 2000.
(0017578)
zed   
01-08-2016 13:37   
На всякий случай:
- Значение cache_size, при желании, можно уменьшать вплоть до 10 страниц
- для увеличения быстродействия конвертирования кэша, можно отключить синхронизацию (synchronous=OFF)
(0017581)
gma   
02-08-2016 06:06   
Полсуток -- полёт нормальный.