Подтвердить что ты не робот

Перемещение между базами данных на диске и быстрой базой данных в памяти?

Параметр Python sqlite3 :memory: обеспечивает более быстрые запросы и обновления, чем эквивалентная база данных на диске. Как я могу загружать базу данных на диск в память, выполнять быстрые операции над ней, а затем записывать обновленную версию на диск?

Вопрос Как просмотреть базу данных sqlite в памяти на python, кажется связанным, но в нем основное внимание уделяется использованию инструмента просмотра на основе диска на базе данных db, Вопрос Как копировать базу данных SQLite в памяти в другую базу данных SQLite в базе данных в Python? также имеет отношение, но она специфична для Django.

Мое текущее решение состоит в том, чтобы читать все таблицы, по одному в базе данных, из базы данных на основе дисков в списки кортежей, затем вручную воссоздавать всю схему базы данных для внутренней памяти db, а затем загружать данные из списков кортежей в db in-memory. После работы с данными процесс отменяется.

Должен быть лучший способ!

4b9b3361

Ответ 1

Ответ на Как загрузить существующий файл db в память в Python sqlite3?, предоставил важные подсказки. Основываясь на этом ответе, мы предлагаем упрощение и обобщение этого кода.

Он устраняет ненужное использование StringIO и упаковывается в многоразовую форму для чтения и записи из базы данных в памяти.

import sqlite3

def copy_database(source_connection, dest_dbname=':memory:'):
    '''Return a connection to a new copy of an existing database.                        
       Raises an sqlite3.OperationalError if the destination already exists.             
    '''
    script = ''.join(source_connection.iterdump())
    dest_conn = sqlite3.connect(dest_dbname)
    dest_conn.executescript(script)
    return dest_conn

if __name__ == '__main__':
    from contextlib import closing

    with closing(sqlite3.connect('pepsearch.db')) as disk_db:
        mem_db = copy_database(disk_db)

    mem_db.execute('DELETE FROM documents WHERE uri="pep-3154"')
    mem_db.commit()

    copy_database(mem_db, 'changed.db').close()

Ответ 2

Честно говоря, я бы не стал слишком обманывать базы данных в памяти, если вам действительно не нужна индексированная структура, которая, как вы знаете, всегда будет полностью входить в доступную память. SQLite чрезвычайно сообразителен в отношении ввода-вывода, особенно когда вы делаете все транзакции (включая чтение...) в транзакции. Он будет очень эффективно хранить вещи в памяти, поскольку он манипулирует структурами данных, которые в основном живут на внешнем хранилище, и тем не менее он никогда не исчерпывает память (и не берет слишком много). Я думаю, что оперативная память действительно работает лучше как "буфер", а не как основное место, где хранятся данные... особенно в среде виртуального хранения, где все должно рассматриваться как "подкрепленное внешними в любом случае."