Считайте запрос SQL размером больше памяти в кадр данных dask. - PullRequest
0 голосов
/ 03 марта 2020

Мне нужно прочитать записи из таблицы SQL в фрейме данных dask, чтобы обработать количество записей, которые мне нужно прочитать, может превысить количество записей, которые могут поместиться в памяти. Как мне сделать sh это с помощью dask ?

В настоящее время я делаю это

def get_frame_from_query(query, column_names):
    frames = []
    batch = []
    # TODO ask stackoverflow about this.

    for row in database_conn.FetchManyIter(query,batch_size=30000): #read from the database 30k rows at a time.

        batch.append({ col:getattr(row,col) for col in column_names})

        if len(batch) == 30000:

            pd_frame = pd.DataFrame(batch, columns=column_names)
            frames.append(dd.from_pandas(pd_frame, npartitions=1, sort=False))
            batch = []

    if len(batch) > 0:
        pd_frame = pd.DataFrame(batch)
        frames.append(dd.from_pandas(pd_frame, npartitions=1, sort=False))

    return dd.concat(frames)

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

1 Ответ

1 голос
/ 03 марта 2020

Я бы посоветовал вам проверить функцию read_sql_table, которую вы вполне можете найти "просто работает" для вашей работы.

Кроме этого, вы не должны удивляться из-за использования памяти, поскольку вы загружаете каждый блок данных pandas в память до того, как у Dask появится шанс что-нибудь сделать для вас. Поскольку вы используете один итератор, очень трудно преобразовать это в отложенную / отложенную операцию для Dask, вам нужен какой-то другой способ для задач, чтобы получить части данных независимо, параллельно.

...