2015-12-03 4 views
0

Немного фона. Это скрипт, предназначенный для сужения большого набора данных (3 + GB файлов). У меня есть серия SQL-запросов для создания временных таблиц для вставки/удаления из других таблиц.SQLite3 Python27 запрос зависает в Windows

Вот что первые несколько запросов выглядит следующим образом:

Запрос # 1

create table clash as 
select * 
from 
    StallConnected 
group by Store, Stall, StartTime 
having 
    count(*) > 1; 

запрос # 2

create table OverlappingStarts as 
select A.* 
from 
    StallConnected as A 
    join 
    clash as B 
    on 
     A.Store = B.Store 
     and 
     A.Stall = B.Stall 
     and 
     A.StartTime = B.StartTime 
    order by 
     A.Store, A.Stall, A.StartTime; 

Теперь на мясо вопроса. Я выполняю эти запросы последовательно, используя соединение db в модуле sqlite3 python на одном потоке. Вот код:

for i, val in enumerate(queries): 
    print "Step " + str(i + 1) + " of " + steps 
    db.executescript(val) 
db.commit() 

Я знаю, что executescript() заставит COMMIT произойти перед выполнением каждого оператора, но то, что происходит в том, что он будет выполнять первый запрос только штраф, но второй запрос будет просто висеть. Никаких исключений, ничего.

Я знаю, что это не может быть тайм-аут, поскольку это работает на одном потоке. Это тоже не исключение (очевидно, оно просто зависает). Я знаю, что это зависает, потому что файл db-journal - всего 2 КБ.

Что я пробовал:

  • Совершение после каждого оператора
  • закрытия/открытия соединения
  • Использование execute() над executescript()
  • Использование объекта курсора над прямого вызова execute() на соединение с базой данных

Любые мысли? Я делаю что-то по своей сути неправильно? Проблема с блокировкой файлов Windows, о которой я не знаю?

EDIT 1: После запуска сценария в течение последнего часа я обнаружил, что часть таблицы фактически заполнена. Какая сделка здесь? Запуск моего всего скрипта sql внутри DB Browser занимает всего около 30 секунд, а в python для заполнения одной части таблицы требуется более 1 часа?

Примечание стороны:

>>> sqlite3.version 
'2.6.0' 
>>> sqlite3.sqlite_version 
'3.6.21' 
>>> 
+1

Это ужасно старая версия SQLite. Вы должны обновить Python или выполнить SQL во внешней оболочке. Во всяком случае, ваша самая большая проблема - недостающие индексы. И покажите нам схему базы данных. –

+0

Оказывается, это был простой случай устаревшего sqlite.dll – cdacamara

ответ

0

Тайна решена! Очевидно, моя библиотека sqlite.dll была ужасно устаревшей и не могла эффективно выполнять объединения (что-то, что сразу не выпрыгнуло на меня).

@CL спасибо за головы!