Как ускорить вставку из панд. DataFrame .to_sql - PullRequest
0 голосов
/ 22 октября 2018

Здравствуйте! В настоящее время я пытаюсь записать данные из четырех фреймов данных pandas в mysql на моем локальном компьютере, моей машине требуется 32 секунды для вставки 20000 записей (5000 для каждой таблицы). Код-

таблиц - 1) posts 2) post_stats 3) post_languages ​​4) post_tags

engine = create_engine("mysql+mysqldb://root:dbase@123@localhost/testDb")

startTime=time.time()

dfstat.to_sql('post_stats', con=engine, if_exists='append', index=False)
for i in range(0, dfp.shape[0]):
ss = str(dfp.iloc[i][0])
sss = 'Select id from post_stats where post_id =\"%s\"' % (ss)
#print(sss)
rss = engine.execute(sss)
x = rss.fetchone()
dfp['stats_id'][i] = x[0]
dfp.to_sql('posts', con=engine, if_exists='append', index=False)
dfl.to_sql('post_languages', con=engine, if_exists='append', index=False)
dftagv.to_sql('post_tags', con=engine, if_exists='append', index=False)


endTime=time.time()
diff=endTime-startTime 
print(diff)

Курс данных Я храню данные на локальном компьютере, но в будущем мне придется отправлять данные на сервер MySQL, есть ли способ ускоритьвставка или есть какой-то другой подход, чтобы я мог хранить данные с большей скоростью, как с помощью массовой вставки.пожалуйста, предложите

1 Ответ

0 голосов
/ 22 октября 2018

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

Попробуйте запустить этот фрагмент до import pandas as pd

from pandas.io.sql import SQLTable

def _execute_insert(self, conn, keys, data_iter):
    print("Using monkey-patched _execute_insert")
    data = [dict((k, v) for k, v in zip(keys, row)) for row in data_iter]
    conn.execute(self.insert_statement().values(data))

SQLTable._execute_insert = _execute_insert

Это патч nhockham для вставки to_sql, который вставляет построчно. Вот проблема github.

Если вы можете отказаться от использования pandas.to_sql, я предлагаю вам попробовать массовую вставку sql-alchemy или просто написать скрипт, чтобы сделать многострочный запрос самостоятельно.

Редактировать: Чтобы уточнить, мы модифицируем метод _execute_insert класса SQLTable в pandas.io.sql, поэтому его нужно добавить в сценарии перед импортом модуля pandas.

Последняя строка - это изменение.

conn.execute(self.insert_statement(), data) был изменен на:

conn.execute(self.insert_statement().values(data))

Первая строка будет вставлять строку за строкой, а последняя строка будет вставлять все строки в одном выражении sql.

Обновление: для более новых версий панд нам потребуется небольшая модификация вышеуказанного запроса.

from pandas.io.sql import SQLTable

def _execute_insert(self, conn, keys, data_iter):
    print("Using monkey-patched _execute_insert")
    data = [dict(zip(keys, row)) for row in data_iter]
    conn.execute(self.table.insert().values(data))

SQLTable._execute_insert = _execute_insert
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...