Вы не упомянули операционную систему, которую вы использовали, или размеры файлов БД. В зависимости от версии Windows могут возникнуть проблемы с файлами размером более 2 ГБ.
В любом случае, поскольку это прославленный пакетный скрипт, почему бы не избавиться от цикла for
, получить имя файла из sys.argv
, а затем просто запустить его один раз для каждого слияния БД. Таким образом, вам никогда не придется иметь дело с проблемами с памятью, если вы будете делать слишком много в одном процессе.
Имейте в виду, если вы закончите цикл с помощью следующего, что, вероятно, также исправит ситуацию.
c.close()
completedb.close()
Вы говорите, что то же самое происходит, когда вы следуете этому процессу, используя CLI и выходя после каждого дБ. Я предполагаю, что вы имеете в виду Python CLI, а выход означает, что вы выходите и перезапускаете Python. Если это так, и проблема возникает в каждой четвертой базе данных, значит, с вашей разделяемой библиотекой SQLITE что-то не так. Не должно быть такого состояния.
Если бы я был на вашем месте, я бы прекратил использовать attach
и просто открыл несколько соединений в Python, а затем переместил данные в пакетах по 1000 записей на коммит. Это будет медленнее, чем ваша техника, потому что все данные перемещаются в объекты Python и из них, но я думаю, что это также будет более надежным. Откройте полную базу данных, затем зациклите, открыв вторую базу данных, скопировав и закрыв вторую базу данных. Для копирования я бы использовал OFFSET и LIMIT в операторах SELECT, чтобы обработать пакеты из 100 записей, затем зафиксировать, а затем повторить.
На самом деле, я бы также подсчитывал завершенные записи b и вторые записи базы данных перед копированием, а затем после копирования подсчитывал записи completeb, чтобы убедиться, что я скопировал ожидаемую сумму. Кроме того, вы будете следить за значением следующего OFFSET, и я запишу его в текстовый файл сразу после фиксации, чтобы я мог прервать и перезапустить процесс в любое время, и он продолжит с того места, где он остановился.