Как загрузить существующий файл db в память в Python sqlite3?

У меня есть существующий файл sqlite3 db, на котором мне нужно сделать некоторые обширные вычисления. Выполнение вычислений из файла очень медленное, а поскольку файл невелик (~ 10 MB ), поэтому не должно быть никаких проблем с его загрузкой в ​​память.

Есть ли способ Pythonic загрузить существующий файл в память, чтобы ускорить вычисления?

6 Solutions collect form web for “Как загрузить существующий файл db в память в Python sqlite3?”

Вот фрагмент, который я написал для моего флеш-приложения:

 import sqlite3 from StringIO import StringIO def init_sqlite_db(app): # Read database to tempfile con = sqlite3.connect(app.config['SQLITE_DATABASE']) tempfile = StringIO() for line in con.iterdump(): tempfile.write('%s\n' % line) con.close() tempfile.seek(0) # Create a database in memory and import from tempfile app.sqlite = sqlite3.connect(":memory:") app.sqlite.cursor().executescript(tempfile.read()) app.sqlite.commit() app.sqlite.row_factory = sqlite3.Row 

sqlite3.Connection.iterdump "[r] eturns итератор для вывода базы данных в текстовом формате SQL. Полезно при сохранении базы данных в памяти для последующего восстановления. Эта функция предоставляет те же возможности, что и команда .dump в оболочке .dump . "

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

Сначала вы должны попытаться выяснить, что вызывает замедленность, которую вы наблюдаете. Вы пишете столы? Являются ли ваши записи в рамках достаточно больших транзакций, чтобы вы не сохраняли ненужные временные результаты на диске? Можете ли вы изменить записи, чтобы перейти к временным таблицам (с помощью pragma temp_store=memory )? Можете ли вы жить с pragma synchronous=off ?

Я не думаю, что эта функция раскрывается в модуле Python, но у sqlite есть API-интерфейс резервного копирования, который звучит точно так, как вы просите: способ копирования из одной базы данных в другую (любой из которых может быть встроенным база данных), которая работает практически автоматически без каких-либо видимых пользователем перечислений таблиц. (Может быть, APSW раскрывает это?)

Другой вариант – создать диск ram (если у вас есть достаточный контроль над средой) и скопировать туда файл.

На это уже был дан ответ, включая примеры кода на In python, как я могу полностью загрузить базу данных sqlite в память до ее подключения?

Вы не упоминаете операционную систему, но один из них касается Windows XP: он по умолчанию использует кеш-память размером 10 МБ, независимо от того, сколько у вас памяти. (Это имело смысл в дни, когда системы поставлялись с 64 МБ и т. Д.). Это сообщение имеет несколько ссылок:

http://marc.info/?l=sqlite-users&m=116743785223905&w=2

Вот относительно простой способ чтения SQLite db в память. В зависимости от ваших предпочтений в отношении управления данными вы либо используете кадр данных Pandas, либо записываете свою таблицу в базу данных sqlite3 в памяти. Аналогично, после манипулирования данными вы используете тот же подход df.to_sqlite, чтобы сохранить результаты в таблице db.

 import sqlite3 as lite from pandas.io.sql import read_sql from sqlalchemy import create_engine engine = create_engine('sqlite://') c = engine.connect() conmem = c.connection con = lite.connect('ait.sqlite', isolation_level=None) #Here is the connection to <ait.sqlite> residing on disk cur = con.cursor() sqlx = 'SELECT * FROM Table' df = read_sql(sqlx, con, coerce_float=True, params=None) #Read SQLite table into a panda dataframe df.to_sql(con=conmem, name='Table', if_exists='replace', flavor='sqlite') 

sqlite поддерживает базы данных в памяти.

В python для этого вы использовали бы имя : memory: database.

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

  • В python, как я могу загрузить sqlite db полностью в память, прежде чем подключаться к нему?
  • Python - Чтение BLOB-типа из SQLite3 DB
  • Проблемы с компиляцией pysqlite на окнах
  • текстовый файл в базу данных sqlite3 с python
  • Ошибка привязки параметра 0: возможно, неподдерживаемый тип
  • Как заблокировать все соединение SQLite (заблокированное чтение + заблокированная запись)?
  • Как использовать вакуумную команду SQLite 3 в Python
  • DatabaseError: таблица OmniCloud_App_user не имеет имени с именем пользователя
  • Python - лучший язык программирования в мире.