【问题标题】:What exactly happens in this example在这个例子中究竟发生了什么
【发布时间】:2022-01-24 00:59:08
【问题描述】:

我在 tpc-h 数据集的一个切片上在dask 中编写 TPC-H 查询 6:

start = time.time()
lineitem = dd.read_csv("s3://tpc-h-csv/lineitem/lineitem.tbl.1",sep="|", header = 0)
df = lineitem.rename(columns=dict(zip(lineitem.columns, lineitem_scheme)))
filtered_df = df.loc[(df.l_shipdate > "1994-01-01") & (df.l_discount >= 0.05) & (df.l_discount <= 0.07) & (df.l_quantity < 24)]
filtered_df['product'] = filtered_df.l_extendedprice * filtered_df.l_discount
print(filtered_df.product.sum().compute())
print(time.time() - start)

我有几个问题:

  1. 这是在Dask 中编写所述查询的最快方式吗?

  2. 我从S3 下载的数据是 48GB。我节点上的内存是 16 GB。 Dask 是否进行批量计算?它是否持久保存到磁盘然后从磁盘读取?会发生什么?

【问题讨论】:

  • 发生的情况是,当您在内存数据和交换到交换文件之间颠簸时,您的进程会慢到爬行。没有人会高兴。
  • 这不是真的。它大量使用磁盘。事实上,内存使用率从未超过 20%。

标签: python pandas amazon-s3 dask dask-dataframe


【解决方案1】:

对于您的第一个问题,这似乎是在 Dask 中编写查询的一种有效方式,尽管鉴于 s3 存储桶不是公开的,因此很难测试。您的任何操作都不需要改组,因此它们都应该相当便宜。对于第二个问题,答案基本上是肯定的,因为你下载的数据集大于可用内存,Dask 会溢出到磁盘。对 Dask 管理内存的方式进行微调有点棘手,如果您有兴趣,还有更多关于 here 的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-16
    • 2021-08-22
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2017-06-11
    • 1970-01-01
    相关资源
    最近更新 更多