2016-07-04 4 views
1

Я пытаюсь использовать пакет DASK в Python 3.4, чтобы избежать проблем с ОЗУ с большими наборами данных, но я заметил проблему.ОЗУ с DASK и функцией from_pandas

Использование native fucntion "read_csv" Я загружаю большой набор данных в базу данных dask с использованием менее 150 МБ ОЗУ.

Тот же набор данных, который считывается с использованием соединения PANDAS DB (с использованием параметров ограничения и смещения) и dask fuction «from_pandas», заполняет мой барабан uo до 500/750 МБ.

Я не могу понять, почему это происходит, и я хочу исправить эту проблему.

Вот код:

def read_sql(schema,tab,cond): 

sql_count="""Select count(*) from """+schema+"""."""+tab 
if (len(cond)>0): 
    sql_count+=""" where """+cond 

a=pd.read_sql_query(sql_count,conn) 
num_record=a['count'][0] 

volte=num_record//10000 
print(num_record) 

if(num_record%10000>0): 
    volte=volte+1 

sql_base="""Select * from """+schema+"""."""+tab 
if (len(cond)>0): 
    sql_base+=""" where """+cond 
sql_base+=""" limit 10000""" 

base=pd.read_sql_query(sql_base,conn) 

dataDask=dd.from_pandas(base, npartitions=None, chunksize=1000000) 

for i in range(1,volte): 
    if(i%100==0): 
     print(i) 
    sql_query="""Select * from """+schema+"""."""+tab 
    if (len(cond)>0): 
     sql_query+=""" where """+cond 
    sql_query+=""" limit 10000 offset """+str(i*10000) 

    a=pd.read_sql_query(sql_query,conn) 

    b=dd.from_pandas(a , npartitions=None, chunksize=1000000) 

    divisions = list(b.divisions) 
    b.divisions = (None,)*len(divisions) 
    dataDask=dataDask.append(b) 

return dataDask 



a=read_sql('schema','tabella','data>\'2016-06-20\'') 

Спасибо за помощь мне

В ожидании новостей

ответ

4

Один dask.dataframe состоит из многих панд dataframes или, как в случае функций, как read_csv план для расчета этих данных по запросу. Он выполняет низкоуровневое выполнение, выполняя этот план для ленивого вычисления данных.

При использовании from_pandas эти данные уже хранятся в памяти, поэтому мало что может сделать dask.dataframe, чтобы избежать раздувания памяти.

В этом случае я вижу три решения:

  • Построй dask.dataframe.read_sql функцию лениво вытаскивать куски данных из базы данных. На момент написания этой строки это делается здесь: https://github.com/dask/dask/pull/1181
  • Используйте dask.delayed для достижения того же результата в коде пользователя. См. http://dask.pydata.org/en/latest/delayed.html и http://dask.pydata.org/en/latest/delayed-collections.html (это мое главное предложение в вашем случае)
  • Дамп вашей базы данных к чему-то вроде файла HDF, для которого уже существует удобная функция dask.dataframe.
+0

Спасибо, я попробую эти методы как можно скорее, а затем я дам вам ответ. –