Я работаю над приложением, которое работает с несколькими десятками фреймов данных 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 минут! Здорово!
Спасибо за любой вклад, который люди могут предложить.
почему бы вам не объединить таблицу и не переместить одну?
Я так делаю в некоторых случаях. Для таблиц, которые я не могу сделать, скажем, Таблица 2 и Таблица 3 в этом примере (предположим, что Таблица 1 представляет множество уже объединенных таблиц), я все еще следую этому процессу по одному за раз. Однако у меня есть десятки таких таблиц, которые представляют информацию из совершенно разных доменов, и этот пошаговый метод использования .to_sql() невероятно медленный.
какая альтернатива? Я предполагаю, что у вас есть альтернатива, и эта альтернатива быстрее, чем ваша текущая реализация. Затем вы можете узнать, что делает альтернатива лучше, чем ваша текущая реализация. Есть ли цикл for? проблема в подключении к базе данных sql? вам нужно сбросить в землю sqlalchemy, чтобы выполнить миграцию?
Спасибо за комментарии. У меня нет альтернативы: насколько я знаю, метод «цикл for», который я изложил выше в примере, — единственный способ, которым я знаю, как это сделать. В настоящее время я использую этот процесс для разработки, но ждать сохранения таблиц более 6 минут, выполняя одну транзакцию записи за раз, вероятно, самый неэффективный способ сделать это. Проблем с подключением к базе данных, так сказать, нет, потому что я использую SQLite (локальный файл). Я надеюсь достичь нескольких таблиц в одной транзакции записи. Может ли sqlalchemy это сделать? Никогда не использовал его, знаю о нем только по имени.
если это так, я бы предложил преобразовать данные в текстовый файл/csv, а затем написать пользовательскую функцию для загрузки csv в sqlite db - это должно быть быстрее. Существует отличный сообщение в блоге для postgres; посмотрите, сможете ли вы настроить его, чтобы он соответствовал вашей цели для sqlite
Да, кажется, что панды не могут удобно делать ничего, кроме .to_sql(), который многим кажется медленным. Похоже, что путь состоит в том, чтобы вручную преобразовать в текст и передать его с помощью sqlalchemy или что-то в этом роде.