Как загрузить существующий файл базы данных в память в Python sqlite3? - PullRequest
56 голосов
/ 03 октября 2010

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

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

Ответы [ 8 ]

106 голосов
/ 01 июня 2012

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

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
16 голосов
/ 03 октября 2010

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

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

8 голосов
/ 03 октября 2010

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

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

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

5 голосов
/ 11 декабря 2017

если мы должны использовать оболочку Python, то нет лучшего решения, чем двухпроходное, чтение и запись.но начиная с версии 3.7.17, SQLite имеет возможность прямого доступа к содержимому диска с помощью отображенного в память ввода-вывода. sqlite mmap

, если вы хотите использовать mmap, вы должны использоватьинтерфейс C, поскольку никакая обертка не обеспечивает его.

и есть другое аппаратное решение, диск памяти. Тогда у вас есть удобный файл ввода-вывода и скорость памяти.

4 голосов
/ 11 мая 2016

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

4 голосов
/ 05 октября 2010

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

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

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

3 голосов
/ 11 ноября 2018

А как насчет sqlite3.Connection.backup(...)? «Этот метод создает резервную копию базы данных SQLite, даже когда к ней обращаются другие клиенты или одновременно по тому же соединению». Доступность: SQLite 3.6.11 или выше. Новое в версии 3.7.

import sqlite3

source = sqlite3.connect('existing_db.db')
dest = sqlite3.connect(':memory:')
source.backup(dest)
0 голосов
/ 03 октября 2010

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

В Python для этого вы должны использовать : memory: имя базы данных.

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

...