Читать большие данные из таблицы базы данных в пандах или дасках - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу прочитать все данные из таблицы с 10+ ГБ данных в кадре данных. Когда я пытаюсь читать с read_sql, я получаю ошибку перегрузки памяти. Я хочу провести некоторую обработку этих данных и обновить таблицу новыми данными. Как я могу сделать это эффективно. Мой ПК имеет 26 ГБ оперативной памяти, но размер данных не превышает 11 ГБ, но я все равно получаю ошибку перегрузки памяти.

В Даске это занимает так много времени. Ниже приведен код.

import dateparser
import dask.dataframe as dd
import numpy as np

df = dd.read_sql_table('fbo_xml_json_raw_data', index_col='id', uri='postgresql://postgres:passwordk@address:5432/database')
def make_year(data):
    if data and data.isdigit() and int(data) >= 0:
        data = '20' + data
    elif data and data.isdigit() and int(data) < 0:
        data = '19' + data
    return data

def response_date(data):
    if data and data.isdigit() and int(data[-2:]) >= 0:
        data = data[:-2] + '20' + data[-2:]
    elif data and data.isdigit() and int(data[-2:]) < 0:
        data = data[:-2] + '19' + data[-2:]
    if data and dateparser.parse(data):
        return dateparser.parse(data).date().strftime('%Y-%m-%d')

def parse_date(data):
    if data and dateparser.parse(data):
        return dateparser.parse(data).date().strftime('%Y-%m-%d')

df.ARCHDATE = df.ARCHDATE.apply(parse_date)
df.YEAR = df.YEAR.apply(make_year)
df.DATE = df.DATE + df.YEAR
df.DATE = df.DATE.apply(parse_date)
df.RESPDATE = df.RESPDATE.apply(response_date)

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Смотрите здесь: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql.html

Видите, что chunksize arg? Вы можете разделить данные на части, чтобы они поместились в память.

Он вернет объект чтения чанка, чтобы вы могли применять операции итеративно к чанкам.

Возможно, вы также можете включить multiprocessing.

Это добавит слой сложности, поскольку вы больше не работаете над самим DataFrame, а над объектом, содержащим куски.

Поскольку вы используете Dask, это "должно" применяться. Я не уверен, как Даск справляется с кусками. Прошло много времени с тех пор, как я коснулся совместимости Pandas / Dask.

0 голосов
/ 05 ноября 2018

Основной проблемой, как представляется, является исключительное использование pd.Series.apply. Но apply - это просто строковый цикл уровня Python . Это будет медленно в Pandas и Dask. Для кода, критичного к производительности, следует отдавать предпочтение операциям со столбцами.

Фактически, dask.dataframe поддерживает полезное подмножество API Pandas. Вот несколько примеров: -

Избегать строковых операций

Сначала преобразуйте данные в числовые типы; затем выполните векторизованные операции. Например:

dd['YEAR'] = dd['YEAR'].astype(int)
dd['YEAR'] = dd['YEAR'].mask(dd['YEAR'] >= 0, 20)
dd['YEAR'] = dd['YEAR'].mask(dd['YEAR'] < 0, 19)

Конвертировать в datetime

Если у вас есть datetime строки в соответствующем формате:

df['ARCHDATE'] = df['ARCHDATE'].astype('M8[us]')

См. Также dask dataframe, как преобразовать столбец в to_datetime .

...