Я установил базу данных 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), но он сбой без ошибок. И самым раздражающим является то, что иногда он работает нормально до конца.
Если он неожиданно выходит из строя без ошибок (или застревает), вы можете добавить утверждения 'print', чтобы увидеть, как далеко он продвигается, пока он не остановится. – glglgl
каждый запрос перед его исполнением имеет оператор печати, поэтому я знаю, в каком запросе я есть. Но когда он останавливается/падает, это не тот же запрос, что и сбой. –
Я также попытался переназначить список строк как, row = list(), но все же он сбрасывает выходы без ошибки. Иногда это происходит в первых 2-3 запросах, а иногда и в конце запросов. –