Попытка найти наиболее эффективный способ преобразования SQL-запросов в Pandas DataFrame с большим количеством записей. - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь запросить представление базы данных MS-SQL и преобразовать результат в Pandas DataFrame.

Ниже приведены два различных способа, которые я пробовал, и в обоих случаях для запроса и преобразования в DataFrame, который имеет 415076 записей (это время предназначено для преобразования, требуется ~ 439,98 секунд (~ 7 минут) это в DataFrame, а не для извлечения данных). Это типичный случай в части ввода / извлечения данных бизнес-логики моего приложения для запроса пользователя.

Примечание. Для запросов с меньшим количеством записей (скажем, в x1000) результат запроса к производительности преобразования DataFrame является быстрым в обоих случаях.

query = """ SELECT * 
            FROM db_view_name 
            WHERE CONDITION_1 = %d AND
            CONDITION_2 IN (%s) """ %(int(val), ','.join(map(str, my_values_list)))
con = pyodbc.connect(con_string)

Case 1:
    cursor = con.cursor()
    result = cursor.execute(query)
    items = [dict(zip([key[0] for key in cursor.description], row)) for row in result]
    df = pd.DataFrame(items)

Case 2:
    df = pd.read_sql_query(query, con)

Моя среда: Я использую Python 3.6 с веб-фреймворком Pyramid и SQLAlchemy ORM.

Как я могу сократить время, необходимое для обработки этих многочисленных записей? Любая помощь по этой проблеме будет принята с благодарностью:)

1 Ответ

0 голосов
/ 08 мая 2018

Просто для ссылки на других (мы уже говорили об этом).

Медленная часть в строках кода выше - преобразование возврата SQL во фрейм данных pandas. Этот шаг не только медленный, но и однопоточный, учитывая поведение Python по умолчанию.

Чтобы обойти это поведение, одним из способов подбора обработки является отправка x подзапросов в отдельных процессах.

Как только мы получим результаты подзапроса, сборка отдельных фреймов данных с помощью pd.concat будет действительно быстрой.

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

Все это позволяет вам распараллеливать задачи с большей автоматизацией, если вы хотите торговать, добавляя другие библиотеки в список зависимостей.

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

...