2016-07-04 3 views
1

큰 데이터 세트의 RAM 문제를 피하기 위해 Python 3.4에서 DASK 패키지를 사용하려고하는데 문제가 있음을 알았습니다.DASK와 from_pandas 함수의 RAM 문제

기본 기능 "read_csv"를 사용하면 150MB 미만의 RAM을 사용하여 dask 데이터 프레임에 큰 데이터 세트를로드합니다.

PANDAS DB 연결 (제한 및 오프셋 옵션 사용) 및 dunge fuction "from_pandas"를 사용하여 읽은 동일한 데이터 세트는 내 RAM을 500/750MB로 채 웁니다.

왜 이런 일이 생길지 모르겠지만이 문제를 해결하고 싶습니다. 여기

코드 :

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이 read_csv 같은 함수의 경우와 같이, 많은 팬더 dataframes로 구성되거나 수요에 따라 데이터 프레임을 계산할 계획. 이 계획을 실행하여 데이터 프레임을 느리게 계산함으로써 메모리 부족 실행을 달성합니다.

from_pandas을 사용하는 경우 데이터 프레임이 이미 메모리에 있으므로 dask.dataframe을 사용하여 메모리가 소모되지 않도록 할 수 있습니다.

+0

고맙습니다. 가능한 한 빨리이 방법을 시도해보고 응답 해 드리겠습니다. –