Как загрузить большой набор данных в Python из MS SQL Server? - PullRequest
0 голосов
/ 24 мая 2019

Настройка : у меня есть предварительно обработанный набор данных на MS SQL Server, который содержит около 500 000 000 строк и 20 столбцов, где один представляет собой довольно длинный текстовый столбец (varchar (1300)), которыйсоставляет около 35 ГБ пространства данных в базе данных SQL.Я работаю на физической машине, где работает MS SQL Server, поэтому сетевой трафик не требуется, и он имеет 128 ГБ ОЗУ.MS SQL Server настроен на максимум 40 ГБ ОЗУ.Я хочу импортировать набор данных в Python для дальнейшей обработки.Предположим, что мы немного углубились в изучение, что важно, потому что мне нужно иметь возможность передавать текстовый столбец как есть.

Анекдот : для тестирования кода импорта я использовал небольшую подвыборкунабор данных около 700.000 строк.Для запуска требуется около 1 минуты, Python использует до 700 МБ ОЗУ, а сохранение переменной в файловой системе после импорта составляет около 250 МБ.Путем экстраполяции импорт полного набора данных должен занять около 700 минут и получить файл размером 175 ГБ.Это довольно много, особенно если сравнивать, скажем, копирование полной таблицы 31 ГБ в SQL, что занимает максимум несколько минут.Я дал ему поработать один день, чтобы увидеть, что происходит безрезультатно.

Альтернативы : Я пытался не использовать pandas и sqlalchemy, а pyodbc напрямую, что привело меня кПолагаю, что проблема заключается в том, как pyodbc работает с импортом данных, так как он хранит запрашиваемые данные в объекте строк, который мне удалось прочитать только по строкам в цикле, что мне кажется очень неэффективным.Я не знаю, могут ли pandas и sqlalchemy сделать это по-разному.Я также попытался не импортировать полный набор данных с помощью одного оператора select, а разделить его на множество более мелких, в результате чего небольшой тестовый набор данных занял 30 минут вместо 1 минуты для загрузки.

Вопрос : Как вообще загрузить этот большой (но не такой большой, по сравнению с другими базами данных) набор данных в Python?Кроме того, должен быть способ сделать это эффективно?Это не должно занимать значительно больше времени, чем копирование полной таблицы в SQL, и не должно занимать значительно больше места, чем таблица в базе данных SQL.Я не понимаю, почему размер данных так сильно увеличивается во время процесса.Решение не должно нуждаться в извлечении таблицы из каких-либо других носителей, кроме Python, в первую очередь (т. Е. Без файлов .csv и т. П.), Хотя использование любых других пакетов Python вполне подходит.

import pyodbc 
import pandas as pd 
import pandas.io.sql as pdsql 
import sqlalchemy

def load_data():

    query = "select * from data.table"
    engine = sqlalchemy.create_engine('mssql+pyodbc://server/database?driver=SQL+Server+Native+Client+11.0?trusted_connection=yes')
    dat = pdsql.read_sql(query, engine)

    dat = dat.sort_values(['id', 'date'])

    return dat
...