У меня есть таблица с 40 миллионами записей в базе данных SQLite, которую мне нужно преобразовать (удалить столбцы и добавить несколько вычисляемых столбцов), объединить с двумя другими таблицами и вставить в базу данных MySQL.Для выполнения этой задачи я использую Python 2.7 для подключения базы данных SQLite и извлечения всей таблицы в кадр данных pandas.
df = pd.read_sql_query("select * from table1", con=dbname)
Я считаю, что загрузка полной таблицы в pandasэто не идеальное решение, и оно исчерпывает общую оперативную память моего ПК.Итак, я начал загружать таблицу порциями (скажем, 5 миллионов записей за раз) и преобразовывать ее с помощью цикла for, а затем помещать ее в базу данных mysql.
sql = 'SELECT * from table1"
for chunk in pd.read_sql_query(sql, con=dbname, chunksize=10**6*5):
df = table2.merge(chunk, on='columns', how='outer')
******tranformation code*******
engine=create_engine("mysql+pymysql://user:user@localhost:3306/dbname")
df.to_sql(name, con=engine, if_exists='append')
Приведенный выше код перемещает фрейм данных в MySQL, но проблема в том, что он создает дублирующиеся записи и длина таблицы 40M * chunksize = 200M records.
Я также проверил, есть ли какие-либо проблемы с частью преобразования кода, и я попытался выполнить тот же процесс для таблицы меньшего размера (около 5 миллионов записей) без цикла, а длина данных приблизительно равна необработанной таблице (из-зак соединениям и трансформации).Таким образом, с кодом преобразования проблем не возникает.
df=pd.read_sql_query("SELECT * from table1", con=dbname)
df=table2.merge(df, on='columns', how='outer)
*******transformation************
engine=create_engine("mysql+pymysql://user:user@localhost:3306/dbname")
df.to_sql('name', con=engine, if_exists='append, chunksize=10**6*5, index=False)
Я не совсем понимаю, в чем проблема, но я был бы очень признателен, если бы мне помогли с этой проблемой..