Баг автоимпорта в больших базах
-
База размером 43GB при автоимпорте рук очень быстро увеличивается в размерах.
При ручном импорте из папки на 1MB рук в папке h2ndb\base\1812411 прибавляется 2,5-3MB, на 10MB соответственно 25-30MB и т.д. т.е. с коэффициентом в 2,5-3 раза больше чем занимали устанавливаемые руки. Но при автоимпорте на 1MB рук прибавляется в 150-500 раз больше места - до 500MB, на 5MB в 50-100 раз больше места - 500-1000MB. И это не заканичивается. Так после нескольких десятков сессий папка увеличилась до 64 GB, т.е. на 21GB, хотя рук было автоимпортировано за это время на 30MB всего. Потом я стал просто класть файлы в папку автоимпорта(т.к. разницы никакой нет, я их туда кладу или рум создаёт) и смотреть что же дальше будет. База растёт и растёт. Уже 78 GB, т.е. прибавилось почти 35 GB непонятно чего, пустоты? База выросла уже почти в 2 раза на ровном месте.
Вот пример.
База до:
Заходим и отыгрываем на PokerStars около 1300 рук. В папке автоимпорта появляется файлов на 1,5MB. Выходим.
База после:
+600MB зачем? почему?
Теперь импорт из папки:
Запускаю H2N. Устанвливаю импортом из папки 1,5MB ТАКИХ ЖЕ РУК.
База после:
+7MB, даже многовато, но ладноЧтобы не было вопросов:
- Таких проблем с автоимпортом не было в версии 3.2.0.20, похоже что они появились в версии 3.2.1.10. Вроде автоимпорт раньше ничем не отличался от ручного импорта из папки.
- Архивация включена.
- Я проверил установку рук из базы стороннего трекера(HM2) - всё также.
- Я переустановил программу полностью, с удалением папки h2ndb. Установил эту же базу с дефолтным конфигом H2N - всё также.
- Я установил эту же базу на внешний Postgre-сервер 9.6 - всё также.
- Я проверил на базе размером в 7GB, там не так всё плохо. База выросла до 8,5GB и перестала расти. ???
- Ещё проверил на базе размером 2GB, ещё лучше. База выросла на 200MB где-то и перестала.
- Включил даже логирование автоимпорта. Посмотрел логи - ошибок не видно. Сделал поиск по словам err, fail и т.д.
Автоимпорт криворукий?
-
Спасибо за подробный пост и потраченное время.
Алгоритм работы такой:
-
Во время импорта программа строит статистику и сохраняет ее частями по мере накопления. Т.е. данные на одного игрока могут хранится в нескольких порциях в разных частях адресного пространства базы данных.
-
Во время игры, программа должна вывести всю статистику на игрока. Для этого она грузит все раскиданные части статистических данных на игрока и обьединяет их. Т.е. данные на игрока становятся цельными, но пока еще находятся в оперативной памяти.
-
Во время автоимпорта, статистические данные на игрока, которые хранятся в оперативной памяти, изменяются.
-
Раз в 5 минут программа сохраняет данные из оперативной памяти в базу. И здесь просходит ключевое событие. Мы удаляем те раскиданные части данных, которые были созданы во время импорта. И сохраняем новые цельные данные из оперативной памяти. Но дело все в том, что постгрес так устроен, что он не станет удалять удаленные нами данные из жесткого диска. Это долгая операция и постгресс ее откладывает до того момента, когда места на диске станет не хватать или же база станет содержать слишком много такого "мусора". Или же если вы запустить Vacuum, Analyze.
Такой большой обьем доп. данных в пересчете на 1 раздачу происходит потому, что вы можете сыграть 1 раздачу, в которой участвовали топ гриндеры лимита, на которых у вас по 1кк рук. 1кк рук занимает 100мб. Того 1 раздача 6-макс даст +600 мб данных в базе.
Но сыграв вторую такую же раздачу, база не изменится, т.к. при повторном сохранении цельных данных, старые не удаляются, а перезаписываются. Это обьясняет почему рост базы данных останавливается и тем раньше, чем меньше размер базы.
-
-
Я приблизительно так и предполагал. Но в версии 3.2.0.20 такого не было. Нельзя вернуть как было раньше? Так как сейчас - это же быстрый расход ресурса SSD-диска. А другие СУБД (MySQL, SQLite etc) также устроены?
-
Как лучше делать vacuum с галочкой analyze?
-
Такой алгоритм работы уже очень давно. По-моему в 3.2.0.20 программа гораздо реже сохраняла данные в базу во время автоимпорта. Наверное, при перезаписи большого обьема данных, в базе тоже остается мусор. Не только при удалении.
Vacuum лучше с галочкой Analyze делать. Попробуйте довести размер базы близким к размеру диска. Постгрес должен будет сам запустить постгрес очистки. По крайней мере версии 9.0+.
-
Участник @fish1147 написал в Баг автоимпорта в больших базах:
А другие СУБД (MySQL, SQLite etc) также устроены?
Так устроены почти все базы.
-
Могу сказать что столкнулся с такой же проблемой, при большой базе, обычная сессия за столами приводила к росту базы на 10-20гб и все свободное место на ссд сжиралось очень быстро. Решения проблемы не нашел, кроме как удалить все базы которые можно было удалить (чтобы на диске было больше места) и пересоздать новую базу с меньшим кол-вом рук.
Вообще неплохо бы какие-то подобные вещи вынести в факью или может быть в уведомления, когда остается мало места на диске с базой.