2015-02-19 2 views
5

Я установил базу данных sqlite3. Я заполнил его некоторыми данными (~ 4 миллиона записей ~ 1,2 ГБ данных). Затем я делаю несколько запросов (выбирает/удаляет/обновляет). Проблема в том, что иногда после вставки скрипт останавливается без ошибки. Иногда он работает нормально до конца. Это тип запросов я бегу:sqlite3 python неожиданное завершение

from __future__ import print_function 
import sqlite3 
import csv 
import os 
import glob 
import sys 
import time 

db = 'test.db' 

conn = sqlite3.connect(db) 
conn.text_factory = str # allows utf-8 data to be stored 

c = conn.cursor() 
i = 0 
### traverse the directory and process each .csv file 

##print("debug") 
csvfile =('/home/Desktop/Untitled Folder/Crimes_-_2001_to_present.csv') 
with open(csvfile, "rb") as f: 
    reader = csv.reader(f) 
    t = time.time() 
    header = True 
    for row in reader: 
     if header: 
      # gather column names from the first row of the csv 
      header = False 

      sql = "DROP TABLE IF EXISTS test_table" 
      c.execute(sql) 
      #print("debug 1") 
      sql = "CREATE TABLE test_table (ID INTEGER,FBI_Code INTEGER,Updated_On TEXT,District TEXT,Beat INTEGER,Primary_Type TEXT,Location BLOB,Latitude REAL,Arrest INTEGER,Domestic INTEGER,Longitude REAL,Community_Area INTEGER,Case_Number INTEGER,Block TEXT,Location_Description TEXT,Ward INTEGER,IUCR INTEGER,Year INTEGER, Date TEXT,Y_Coordinate INTEGER,Description TEXT,X_Coordinate INTEGER);" 
      c.execute(sql) 
      #print("debug 2") 
      insertsql = "INSERT INTO test_table VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)" 
      rowlen = len(row) 
      #print("debug 3") 
     else: 
      # skip lines that don't have the right number of columns 
      #print("debug 4") 
      #if len(row) == rowlen: 
       #print("debug 5") 
      try: 
       c.execute(insertsql, row) 
      except: 
       print("problem in row %d" % i) 
       print(row) 
       continue 

      # print("debug 6") 
      i +=1 
      if i == 1000: 
       conn.commit() 
####   if i == 4000000: 
####    break 
##   #print (row) 
conn.commit() 

print('\nTime for Insertions TOTAL~> \n') 
print(float(time.time() -t)) 

print('\nTime for Insertions per Query~> \n') 
print(float(time.time() -t)/i) 
del rows 
rows = list() 

print('\nTime for Selections ~> Domestic\n') 
t = time.time() 
c.execute("SELECT * FROM test_table WHERE Domestic == 'false'") 
rows = c.fetchall() 
print(float(time.time() -t)) 
print(len(rows)) 
del rows 
rows = list() 

print('\nTime for Selections ~> Arrests\n') 
t = time.time() 
c.execute("SELECT * FROM test_table WHERE Arrest == 'false'") 
rows = c.fetchall() 
print(float(time.time() -t)) 
print(len(rows)) 
del rows 
rows = list() 

print('\nTime for Selections ID~> \n') 
t = time.time() 
c.execute("SELECT * FROM test_table WHERE ID < 9938614") 
rows = c.fetchall() 
print(float(time.time() -t)) 
print(len(rows)) 
del rows 
rows = list() 

print('\nTime for Selections ~> Primary_Type\n') 
t = time.time() 
c.execute("SELECT * FROM test_table WHERE Primary_Type == 'BATTERY'") 
rows = c.fetchall() 
print(float(time.time() -t)) 
print(len(rows)) 
del rows 
rows = list() 

print('\nTime for Selections Year~> \n') 
t = time.time() 
c.execute("SELECT * FROM test_table WHERE Year <= 2014") 
rows = c.fetchall() 
print(float(time.time() -t)) 
print(len(rows)) 
del rows 
rows = [] 

print('\nTime for Updates ~> YEAR\n') 
t = time.time() 
c.execute("UPDATE test_table SET Year = '2016' WHERE Year == '2014'") 
print(float(time.time() -t)) 

print('\nTime for Selections Year~> \n') 
t = time.time() 
c.execute("SELECT * FROM test_table WHERE Year <= 2014") 
rows = c.fetchall() 
print(float(time.time() -t)) 
print(len(rows)) 

print('\nTime for DELETIONS ~> Domestic\n') 
t = time.time() 
c.execute("DELETE FROM test_table WHERE Domestic == 'false'") 
rows = c.fetchall() 
print(float(time.time() -t)) 
print(len(rows)) 
del rows 

c.close() 
conn.close() 

Каждый раз, когда я переназначить список строки потому что после некоторых запросов я бегу из памяти. Но я не думаю, что это проблема (на всякий случай я использовал del rows & переназначил его, это было медленнее). В любом случае после некоторых из этих запросов скрипт останавливается без ошибок, и я не могу понять, почему, потому что есть несколько раз, когда он работает нормально.

Редактировать

Я включил код, указанный выше. Проблема в том, что после вставки, когда я выполняю запросы, скрипт завершается без каких-либо ошибок.

Например он идет до здесь:

... Время для Подборки ~> Аресты

123,231

, а затем она заканчивается. В первом подходе я не удалял список, и Cython выпускал ошибки ядра, когда я пытался повторно объявить список. Теперь, когда я удаляю, а затем объявляю список, Cython работает нормально. Мой вопрос в том, почему python не поймает никаких исключений?

После переназначения списка сборщик мусора очищает данные мусора (и это происходит, как я видел из монитора linux), но он сбой без ошибок. И самым раздражающим является то, что иногда он работает нормально до конца.

+0

Если он неожиданно выходит из строя без ошибок (или застревает), вы можете добавить утверждения 'print', чтобы увидеть, как далеко он продвигается, пока он не остановится. – glglgl

+0

каждый запрос перед его исполнением имеет оператор печати, поэтому я знаю, в каком запросе я есть. Но когда он останавливается/падает, это не тот же запрос, что и сбой. –

+0

Я также попытался переназначить список строк как, row = list(), но все же он сбрасывает выходы без ошибки. Иногда это происходит в первых 2-3 запросах, а иногда и в конце запросов. –

ответ

0

У меня была точно такая же проблема, моим решением было создать новый курсор, затем я обработал SQL Select одним курсором и вставлял/удалял его с помощью другого.

conn = sqlite3.connect(db) 
c = conn.cursor() 
c2 = conn.cursor() 
Смежные вопросы