Загрузите сохраненный на диске экземпляр DuckDB в новый экземпляр DuckDB в памяти

Я работаю над проектом, в котором на первом этапе я извлекаю некоторые необработанные данные, выполняю их обработку в DuckDB и в итоге получаю кучу таблиц, которые используются кучей последующих компонентов, которые также работают. в дакдб.

Я хотел бы, чтобы результаты первого этапа сохранялись на диске и не изменялись последующими компонентами, но последующие компоненты должны, по крайней мере, иметь возможность создавать представления и временные таблицы. Более того, нет никаких причин, чтобы последующие компоненты работали на диске... данные достаточно малы, чтобы поместиться в памяти.

Мне бы хотелось волшебного решения, например

conn = duckdb.connect(":memory:")
conn.load_from_disk(path_to_on_disk)

но ничего подобного, кажется, не существует. Я могу прочитать каждую таблицу из соединения на диске, преобразовать в панды, а затем загрузить в соединение в памяти, но это занимает вечность.

Есть идеи?

Пример этого неэффективного подхода:


def load_disk_duck_to_mem_duck(path: pathlib.Path) -> duckdb.DuckDBPyConnection:
    """Slow and ugly!"""
    source_db = duckdb.connect((path / "duck.db").as_posix())
    in_memory_db = duckdb.connect(":memory:")

    tables = source_db.execute("SHOW TABLES").fetchall()

    # Copy each table from on-disk to in-memory
    for table in tables:
        table_name = table[0]
        temp_df = source_db.table(table_name).df()
        # Load the table from on-disk and create a copy in the in-memory database
        in_memory_db.from_df(temp_df).create(table_name)
    return in_memory_db

🤔 А знаете ли вы, что...
С Python можно создавать ботов для социальных сетей и мессенджеров.


1
53
2

Ответы:

Решено

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

Это можно сделать с помощью оператора DuckDB EXPORT DATABASE.

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

Таким образом, каждый нижестоящий компонент должен читать экспортированную базу данных, например. используя оператор IMPORT DATABASE.


В качестве альтернативы, если вам нужен один файл, вы можете использовать ATTACH и COPY DATABASE, например:

attach 'test.db' as test;
copy from database memory to test;

Предполагается, что указанный файл (в примере «test.db») еще не существует.


Вы также можете ПРИСОЕДИНИТЬ постоянную базу данных как read_only и работать с ней таким образом из базы данных в памяти, где вы создаете VIEW и временные таблицы.