【问题标题】:does dask compute store results?dask 计算存储结果吗?
【发布时间】:2022-08-06 12:29:51
【问题描述】:

考虑以下代码

import dask
import dask.dataframe as dd
import pandas as pd

data_dict = {\'data1\':[1,2,3,4,5,6,7,8,9,10]}
df_pd     = pd.DataFrame(data_dict) 
df_dask   = dd.from_pandas(df_pd,npartitions=2)

df_dask[\'data1x2\'] = df_dask[\'data1\'].apply(lambda x:2*x,meta=(\'data1x2\',\'int64\')).compute()

print(\'-\'*80)
print(df_dask[\'data1x2\'])
print(\'-\'*80)
print(df_dask[\'data1x2\'].compute())
print(\'-\'*80)

我想不通的是:为什么第一次和第二次打印的输出有区别?毕竟,我在应用函数时调用了计算并将结果存储在 df_dask[\'data1x2\'] 中。

    标签: python pandas dataframe dask dask-dataframe


    【解决方案1】:

    第一次打印只会显示 dask 系列的懒惰版本,df_dask["data1x2"]

    Dask Series Structure:
    npartitions=2
    0    int64
    5      ...
    9      ...
    Name: data1x2, dtype: int64
    Dask Name: getitem, 15 tasks
    

    这显示了分区数、索引值(如果已知)、需要完成的任务数以获得最终结果,以及一些其他信息。在这个阶段,dask 没有计算实际的序列,所以这个 dask 数组中的值是未知的。调用.compute 启动计算获取实际值所需的 15 个任务,这就是第二次打印的内容。

    【讨论】:

    • 但是在第一次打印之前的行中,我确实调用了计算并将它们存储在 dask 数据框中。他们没有被存储吗?
    • 哎呀,没看出来。它们已存储,但整体数据框仍然是惰性的。
    • 唔。我可以理解对计算的懒惰(除非需要结果,否则您不会计算),但在这里,没有计算。只是存储通过调用计算计算的数字。在这种情况下,懒惰是什么意思?整体数据框仍然是惰性的是什么意思?
    • 不确定这是否会有所帮助,但想象一下有人带着一箱数据来找你。你看不到里面有什么,但你可以要求执行一些计算并得到结果。因此,您要求检索 data1 列乘以 2 并说将其作为 data2x 存储在框中。现在这个盒子被别人拿走了……
    • 这是一个非常好的答案。我添加了另一个,以帮助澄清没有不懒惰的 dask.dataframe 这样的东西。调用 compute 不会创建非惰性 dask 系列 - 它会创建 pandas 系列。因此有区别!
    【解决方案2】:

    Dask 确实将结果存储在工作程序或调度程序的内存中。但这并不是导致显示结果差异的原因。两者的显示方式不同,因为它们是不同类型的对象。

    df_dask['data1x2'] 是一个dask.dataframe.Series,它只会显示数据结构的预览以及有关计算值所涉及的任务数量的信息。显示任何数据至少需要将数据移动到主线程,如果不是计算和可能的 I/O,所以 dask 永远不会这样做,除非明确要求,例如与df.head()

    df_dask['data1x2'].compute()pandas.Series。它不再与 dask 有任何关系,并且根据定义在内存中。由于所有 pandas 数据结构都在内存中,因此数据以默认方式显示。

    当您在 dask 对象上调用 compute 时,它​​不再是 dask 对象。在这种情况下,第一个计算返回一个 pandas 系列。当您将 pandas 系列分配给 dask 数据框时,dask 将数据分区并将数据发送给工作人员,然后无法再显示整个系列。因此,如果您想看到显示的系列,您必须再次调用 compute。

    想象一下,如果您的整个数据框太大而无法放入内存中,这将是多么有用,例如如果你有 1000 列和 10m 行。这就是 dask 的设计目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多