У меня была аналогичная проблема, работая с Oracle db (для меня выяснилось, что потребовалось много времени, чтобы получить все данные, в течение которых я понятия не имел, насколько далеко это было или была ли какая-либо проблема продолжалось) - мое решение состояло в том, чтобы передать результаты моего запроса в набор файлов csv, а затем загрузить их в Pandas.
Я уверен, что есть более быстрые способы сделать это, но это на удивление хорошо работало для наборов данных размером около 8 миллионов строк.
Вы можете увидеть код, я использовал на моей странице Github для easy_query.py, но функция ядра я выглядела так:
def SQLCurtoCSV (sqlstring, connstring, filename, chunksize):
connection = ora.connect(connstring)
cursor = connection.cursor()
params = []
cursor.execute(sqlstring, params)
cursor.arraysize = 256
r=[]
c=0
i=0
for row in cursor:
c=c+1
r.append(row)
if c >= chunksize:
c = 0
i=i+1
df = pd.DataFrame.from_records(r)
df.columns = [rec[0] for rec in cursor.description]
df.to_csv(filename.replace('%%',str(i)), sep='|')
df = None
r = []
if i==0:
df = pd.DataFrame.from_records(r)
df.columns = [rec[0] for rec in cursor.description]
df.to_csv(filename.replace('%%',str(i)), sep='|')
df = None
r = []
импортирует окружающий модуль cx_Oracle, чтобы обеспечить различные крюки базы данных/API-вызовы, но я ожидаю, что там будут аналогичные функции, доступные с помощью аналогичного MySQL MySQL.
Приятно, что вы можете видеть файлы, созданные в выбранном вами каталоге, поэтому вы получаете обратную связь о том, работает ли ваш экстракт, и сколько результатов в секунду/минуту/час вы можете получить ,
Это также означает, что вы можете работать с исходными файлами, пока остальные извлекаются.
После того, как все данные будут сохранены в отдельных файлах, их можно будет загрузить в один кадр данных Pandas, используя несколько pandas.read_csv и pandas.concat операторов.
Не извлекайте 5 миллионов записей, особенно для широкого стола, I/O убьет вас. – dbugger
@ dbugger: Да, извините, запрос есть только пример, я не 'SELECT * FROM table', но все же, если я куском, создание итератора для относительно небольшого подмножества записей (> 10%) никогда не будет end ... Поэтому я думаю, что я делаю что-то неправильно с рабочим процессом. Благодарю. –
Просто убедитесь, что нет ничего плохого (кроме размера), если вы добавите 'LIMIT 100' (или больше) в запрос, он работает так, как ожидалось? – joris