Импорт 11 миллионов строк из Postgresql в Pandas / Python - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь загрузить 11 миллионов записей из базы данных PostgreSQL, размещенной на сервере AWS. Я пытался использовать pandas read_ sql, и я получаю результат через 4 часа. У меня на ноутбуке 32 ГБ ОЗУ, а также Core i7, 7-го поколения. Я также установил размер чанка на 10000, но это не улучшает сумасшедшее время. Я просмотрел много статей в Интернете и перепробовал их все, но ни одна из них не ускоряет мой процесс. В идеале я хочу загрузить эти данные за 20 минут, если это возможно, или в кратчайшие сроки. Мне нужны эти данные в фрейме данных, чтобы я мог выполнить некоторые слияния с другими имеющимися у меня файлами, и если я смогу извлечь данные в Python, я смогу автоматизировать свой процесс. Мой код отображается ниже:

from io import StringIO
import psycopg2
import psycopg2.sql as sql
import pandas as pd
import numpy as np
import time


connection = psycopg2.connect(user="abc",
                                      password="efg",
                                      host="123.amazonaws.com",
                                      port="5432",
                                      database="db")

date='2020-03-01'
columns= '"LastName","FirstName","DateOfBirth","PatientGender","Key"'

postgreSQL_select_Query = 'select ' +  columns + ' from "Table" where "CreatedDate"::date>=' + "'" + date + "'" + 'limit 11000000'


x=pd.read_sql_query(postgreSQL_select_Query, connection, index_col=None, coerce_float=True, params=None, parse_dates=None, chunksize=10000)

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

Я также присоединяю другой сегмент кода, который я использую для выполнения это, но тот же результат, что и выборка строк в часах. Любое руководство будет с благодарностью.

Второй подход:

# -*- coding: utf-8 -*-

@author: ssullah
"""
from io import StringIO
import psycopg2
import psycopg2.sql as sql
import pandas as pd
import numpy as np
import time

start = time.time()
print("Started")

#Retreiving records from DB
def getdata():  
    try:
        start = time.time()
        print("Started")
        connection = psycopg2.connect(user="a"
                                      password="as",
                                      host="aws",
                                      port="5432",
                                      database="as")


        cur= connection.cursor()

        date='2020-03-01'
        columns= '"LastName","FirstName","DateOfBirth","PatientGender","Key"'

        postgreSQL_select_Query = 'select ' +  columns + ' from "ALLADTS" where "CreatedDate"::date>=' + "'" + date + "'" + 'limit 11000000'

        cur = connection.cursor('cursor-name') # server side cursor
        cur.itersize = 10000 # how much records to buffer on a client
        cur.execute(postgreSQL_select_Query)

        mobile_records = cur.fetchall() 


    #Column names as per schema, defined above
        col_names=["LastName","FirstName","DateOfBirth","PatientGender","Key"]

    # Create the dataframe, passing in the list of col_names extracted from the description
        records = pd.DataFrame(mobile_records,col_names)

        return records;


    except (Exception, psycopg2.Error) as error :
        print ("Error while fetching data from PostgreSQL", error)

    finally:
        #closing database connection.
        if(connection):
            cursor.close()
            connection.close()
            print("PostgreSQL connection is closed")


records=getdata()
end = time.time()
print("The total time:", (end - start)/60, 'minutes')

1 Ответ

0 голосов
/ 04 апреля 2020

Обновление:

Вместо загрузки данных в Python я решил создать временную таблицу в postgresql, используя Python, и загрузить новый файл из pandas в Postgresql. Как только таблица была заполнена с использованием запроса в python, я смог запросить и получить желаемый результат в виде окончательного результата в фрейме данных panda.

Все это заняло 1,4 минуты, и тот же запрос для запуска в Pgadmin требуется 30 минут, поэтому, используя Python и выполняя вычисления с использованием sql запроса, написанного в Python, я смог экспоненциально ускорить процесс, и в то же время не пришлось иметь дело с 11 миллионов записей в моей памяти. Спасибо за ваш совет.

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