Я работаю над проектом, в котором на первом этапе я извлекаю некоторые необработанные данные, выполняю их обработку в 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
Я хотел бы, чтобы результаты первого этапа сохранялись на диске.
Это можно сделать с помощью оператора DuckDB EXPORT DATABASE
.
... последующие компоненты должны, по крайней мере, иметь возможность создавать представления и временные таблицы. Более того, нет никаких причин, чтобы последующие компоненты работали на диске... данные достаточно малы, чтобы поместиться в памяти.
Таким образом, каждый нижестоящий компонент должен читать экспортированную базу данных, например. используя оператор IMPORT DATABASE
.
В качестве альтернативы, если вам нужен один файл, вы можете использовать ATTACH и COPY DATABASE, например:
attach 'test.db' as test;
copy from database memory to test;
Предполагается, что указанный файл (в примере «test.db») еще не существует.
Вы также можете ПРИСОЕДИНИТЬ постоянную базу данных как read_only и работать с ней таким образом из базы данных в памяти, где вы создаете VIEW и временные таблицы.
Ура! Спасибо