我正在尝试在 Python 3.4 中使用 DASK 包来避免大型数据集出现 RAM 问题,但我注意到一个问题。
使用 native 函数“read_csv”,我使用不到 150MB 的 RAM 将大数据集加载到 dask 数据帧中。
使用 PANDAS DB 连接(使用限制和偏移选项)和 dask 函数“from_pandas”读取的相同数据集将我的 ram 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 由许多 pandas 数据帧组成,或者像 read_csv
这样的函数的情况下,一个按需计算这些数据帧的计划。它通过执行该计划来延迟计算数据帧,从而实现低内存执行。
当使用 from_pandas
时,数据帧已经在内存中,因此 dask.dataframe 几乎无法避免内存爆炸。
在这种情况下,我看到三种解决方案:
- 构建一个
dask.dataframe.read_sql
函数来从数据库中延迟提取数据 block 。在撰写本文时,这里正在进行: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 函数。
关于python - DASK 及其 from_pandas 函数的 RAM 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38180447/