Присоединение к фрейму данных в памяти с очень большой постоянной таблицей в БД? - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть фрейм данных в памяти, который имеет определенные идентификаторы, используя эти идентификаторы, я хочу получать только релевантные данные из очень большой (500M строк) таблицы, сохраняемой в СУБД (Sql сервер).

Какой лучший способ сделать это? Определенно не хочу принести всю таблицу в память. И я не могу пройти через все 1009 *. Если бы это был ключ для поиска в одном столбце, я все еще мог бы подумать о создании строки, разделенной запятыми, и выполнении предложения IN для этого списка, но у меня есть несколько полей, которые являются идентификаторами.

Единственный вариант, который я вижу, - сохранение кадра данных в БД, делая соединение на сервере БД и возвращая данные обратно. Но кажется таким неуклюжим.

Я читал о dask как опцию, но не совсем уверен в этом, потому что сохранение всей таблицы в памяти / на диске все еще не кажется мне эффективным методом

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Пока я использовал сохраненный профессионал c с табличным параметром (tvp), приятно то, что определение табличного параметра также может определять индексы для полей. Pyodb c внедрил tvp в 2018 году, поэтому все, что вам нужно сделать, это создать список списков в качестве параметра, который соответствует типам данных вашего пользовательского параметра таблицы в SQL Server. (Спасибо RaviDesai за упоминание табличного параметра в комментариях)

import pandas as pd
import pyodbc

conn_string = 'DRIVER={ODBC Driver 17 for SQL Server};SERVER=test;DATABASE=test;UID=user;PWD=password'
conn = pyodbc.connect(conn_string)        
tvp = []
dt = datetime(2011, 3, 4)
tvp.append(['123', dt])
tvp.append(['222', dt])
tvp.append(['333', dt])
sql = "exec dbo.p_test_tvp_sp ?"
df = pd.read_sql(sql, conn, params=[tvp])
1 голос
/ 12 апреля 2020

Единственный вариант, который я вижу, это сохранение кадра данных в базу данных, выполнение соединения на сервере базы данных и возврат данных. Но выглядит так неуклюже.

Это звучит как наиболее эффективный вариант с точки зрения времени вычислений.

Я читал о dask как опцию, но не совсем уверен об этом, потому что перенос всей таблицы в память / диск все еще не кажется мне эффективным методом

Если ваш фрейм данных с записями, которые вас интересуют, мал, то Dask Dataframe, вероятно, не будет читать все в памяти сразу. Вероятно, он будет сканировать вашу базу данных разумно в небольшом пространстве. Реальная стоимость использования Dask заключается в том, что вам нужно перемещать данные в базу данных и из нее, что будет медленным или быстрым в зависимости от вашего коннектора базы данных.

Я бы попробовал и посмотрел, как он работает .

...