Я пытаюсь перебрать одну базу данных SQLite (я назову ее базой данных A), создать несколько новых переменных из данных внутри нее, а затем записать эти новые данные в новую базу данных SQLite (база данных B).
База данных A состоит из таблиц, которые состоят из твитов об определенных терминах для определенного месяца (каждый твит и его метаданные представляют собой строку, и каждый день месяца включается).Размер каждой таблицы примерно 0,5 ГБ.
Итак, я перебираю эти таблицы, создаю переменную и затем записываю / фиксирую эти новые данные в базе данных B.
Проблема заключается в том, что после перебора нескольких таблиц рабочая память(У меня 16 ГБ ОЗУ) на сервере, который я использую, полностью израсходовано (используя команду free -m
в BASH, я вижу, что около половины ОЗУ используется буфером / кэшем).Это не генерирует никаких ошибок, которые я вижу в моем выходном файле (который обычно показывает сообщения об ошибках Python), но скрипт останавливается.
Я думаю, что это результат временных файлов, созданных SQLite (https://www.sqlite.org/tempfiles.html),, которые продолжают расти по мере продолжения цикла for. Итак, я попытался перебирать строки в таблице день за днеми каждый день фиксирую новые данные в базе данных B, так что журнал отката (см. ссылку выше) - один из этих временных файлов SQL - удаляется (тем самым освобождая память). Однако даже после внесения этих изменений я сталкиваюсь ста же проблема (остановка скрипта).
Я не уверен, насколько сильно здесь поможет код, но вот основные принципы того, что я делаю:
import sqlite3
import pandas
#this defines the SQL query; [long list of columns] is just comma separated column names: id, date, time, etc.
sql_query = ("SELECT DISTINCT [long list of columns] "
"FROM term "
"WHERE date = 'day';")
### HERE I GET ALL TABLES IN DATABASE A ###
#go through all the tables in Database A
for t in tables:
term = t
### HERE I GET THE DAYS IN THE CURRENT TABLE ###
#go through each day in the current table in Database A
for day in days:
#open the databases
connection = sqlite3.connect("../SQL_database/Database_A.db3")
lite_cursor = connection.cursor()
connection_new = sqlite3.connect("../SQL_database/Database_B.db3")
lite_cursor_new = connection_new.cursor()
#change SQL query to match current day and term
sql_query = sql_query.replace('day', day)
#extract the data from the database and put it in the new database
for chunk in pandas.read_sql_query(sql_query, connection, chunksize = 10000):
### HERE I PROCESS THE DATA ###
#add the current data set to Database B
new_table = term
chunk.to_sql(new_table, connection_new, if_exists='append', index=True)
#redefine SQL query; [long list of columns] is just comma separated column names: id, date, time, etc.
sql_query = ("SELECT DISTINCT [long list of columns] "
"FROM term "
"WHERE date = 'day';")
#commit the changes
connection_new.commit()
#close the databases
connection.close()
connection_new.close()
Конечно, чтоЯ хочу, чтобы скрипт выполнялся без пауз / сбоев! Есть ли способ очистить кэш памяти SQLite, чтобы память не была израсходована при продолжении цикла for? Я думал, что commit () освободит некоторую память, нопо-видимому, это не достаточно для выпуска.
Заранее спасибо!