Загрузите сохраненный на диске экземпляр 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 есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

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


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

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

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

Ура! Спасибо

MHankin 30.08.2024 06:01

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

Другие вопросы по теме