Сохранение нескольких фреймов данных pandas в SQLite за одну транзакцию

avatar
Connor Ferster
8 августа 2021 в 23:23
562
0
0

Я работаю над приложением, которое работает с несколькими десятками фреймов данных pandas в памяти, и я использую SQLite в качестве формата файла приложения. В настоящее время я сохраняю каждый DataFrame следующим образом:

import pandas as pd
import sqlite3

df1 = pd.DataFrame(data=data1)
df2 = pd.DataFrame(data=data2)
df3 = pd.DataFrame(data=data3)

my_dfs = {
    "Table1": df1,
    "Table2": df2,
    "Table3": df3,
}
with sqlite3.connect("my_db.sqlite") as my_db:
    for table_name, df in my_dfs.items():
        df.to_sql(table_name, my_db, if_exists="replace")

Однако, для нескольких десятков DataFrames, которые у меня есть, эта итерация-по-моей-набору-таблиц-и-использованию-.to_sql() становится ДЕЙСТВИТЕЛЬНО медленной.

Я только что провел полчаса, выполняя различные поиски в Интернете / SO для таких вещей, как «массовое сохранение таблиц фреймов данных pandas в sqlite» и «сохранение списка фреймов данных в таблицах sqlite», но я ничего не вижу. Есть ли способ сделать это эффективно в одной транзакции с моей базой данных?

В настоящее время сохранение всех моих таблиц в базе данных занимает около 5-6 минут! Здорово!

Спасибо за любой вклад, который люди могут предложить.

Источник
sammywemmy
8 августа 2021 в 23:27
0

почему бы вам не объединить таблицу и не переместить одну?

Connor Ferster
10 августа 2021 в 00:32
0

Я так делаю в некоторых случаях. Для таблиц, которые я не могу сделать, скажем, Таблица 2 и Таблица 3 в этом примере (предположим, что Таблица 1 представляет множество уже объединенных таблиц), я все еще следую этому процессу по одному за раз. Однако у меня есть десятки таких таблиц, которые представляют информацию из совершенно разных доменов, и этот пошаговый метод использования .to_sql() невероятно медленный.

sammywemmy
10 августа 2021 в 00:42
0

какая альтернатива? Я предполагаю, что у вас есть альтернатива, и эта альтернатива быстрее, чем ваша текущая реализация. Затем вы можете узнать, что делает альтернатива лучше, чем ваша текущая реализация. Есть ли цикл for? проблема в подключении к базе данных sql? вам нужно сбросить в землю sqlalchemy, чтобы выполнить миграцию?

Connor Ferster
11 августа 2021 в 01:57
0

Спасибо за комментарии. У меня нет альтернативы: насколько я знаю, метод «цикл for», который я изложил выше в примере, — единственный способ, которым я знаю, как это сделать. В настоящее время я использую этот процесс для разработки, но ждать сохранения таблиц более 6 минут, выполняя одну транзакцию записи за раз, вероятно, самый неэффективный способ сделать это. Проблем с подключением к базе данных, так сказать, нет, потому что я использую SQLite (локальный файл). Я надеюсь достичь нескольких таблиц в одной транзакции записи. Может ли sqlalchemy это сделать? Никогда не использовал его, знаю о нем только по имени.

sammywemmy
11 августа 2021 в 02:00
0

если это так, я бы предложил преобразовать данные в текстовый файл/csv, а затем написать пользовательскую функцию для загрузки csv в sqlite db - это должно быть быстрее. Существует отличный сообщение в блоге для postgres; посмотрите, сможете ли вы настроить его, чтобы он соответствовал вашей цели для sqlite

Connor Ferster
11 августа 2021 в 02:18
0

Да, кажется, что панды не могут удобно делать ничего, кроме .to_sql(), который многим кажется медленным. Похоже, что путь состоит в том, чтобы вручную преобразовать в текст и передать его с помощью sqlalchemy или что-то в этом роде.

Ответы (0)