DASK及其from_pandas函数的RAM问题
问题描述:
我试图在Python 3.4中使用DASK包,以避免大数据集的RAM问题,但我发现了一个问题。DASK及其from_pandas函数的RAM问题
使用本机功能“read_csv”我使用少于150MB的RAM将大数据集加载到dask数据帧中。
使用PANDAS DB Connection(使用限制和偏移选项)和dask功能“from_pandas”读取的数据集填充我的公羊uo到500/750 MB。
我不明白为什么发生这种情况,我想解决这个问题。
下面的代码:
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\'')
感谢您的帮助我
等待消息
答
一个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函数。
谢谢,我会尽快尝试这种方法,然后我会给你回复。 –