DASK的RAM问题及其from峎pandas函数

2024-09-29 06:23:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在python3.4中使用DASK包来避免大型数据集的RAM问题,但是我注意到了一个问题。在

使用本机函数“read_csv”,我使用小于150MB的RAM将大数据集加载到dask数据帧中。在

使用PANDAS DB Connection(使用limit和offset选项)和dask函数“from unu PANDAS”读取的相同数据集将我的ramuo填充到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\'')

谢谢你的帮助

等待消息


Tags: 数据fromreadsqlbaselenifschema
1条回答
网友
1楼 · 发布于 2024-09-29 06:23:18

一数据帧由许多pandas数据帧组成,或者像read_csv这样的函数的情况下,一个按需计算这些数据帧的计划。它通过执行延迟计算数据帧的计划来实现低内存执行。在

当使用from_pandas时,数据帧已经在内存中,因此很少有数据帧可以避免内存爆炸。在

在这种情况下,我看到了三种解决方案:

  • 构建一个dask.dataframe.read_sql函数来从数据库中延迟地提取数据块。在撰写本文时,这里正在进行中:https://github.com/dask/dask/pull/1181
  • 使用dask.delayed在用户代码中获得相同的结果。请参见http://dask.pydata.org/en/latest/delayed.html和{a3}(这是我在您的案例中的主要建议)
  • 将数据库转储到类似HDF文件的文件中,对于HDF文件,已经有了一个方便的方法数据帧功能。在

相关问题 更多 >