2017-08-07 29 views
2

我有几个文件以一列,其被称为idx,我想用它作为指标。获得的数据帧大约有13M行。我知道我可以阅读并以这种方式分配指标(这是慢〜40秒)DASK dataframes known_divisions和性能

df = dd.read_parquet("file-*.parq") 
df = df.set_index("idx") 

或在此的其他方式(这是快速〜40毫秒)

df = dd.read_parquet("file-*.parq", index = "idx") 

通过简单的操作因为用第二种方法计算的长度快了4倍。我不明白的是

  • 在第一种情况下df.known_divisions回报True,而第二个是False。我预料到了相反的行为。然后,我在df之上做了几次操作,没有知名度我总是获得更好的性能。我在摸索着想弄清楚这是否有意或无意。
  • 分区的数量是文件的数量。我如何设置不同数量的分区?

UPDATE 它不只是计算len这是更快。在我的计算,我创建使用GROUPBY,申请和参加了几次4个新dataframes而这些都是定时

|     |Load and reindex (s)|Load with index (s)| 
|:-----------------|-------------------:|------------------:| 
| load    |   12.5000 |   0.0124 | 
| grp, apply, join |   11.4000 |   6.2700 | 
| compute()  |   146.0000 |   125.0000 | 
| TOTAL   |   169.9000 |   131.2820 | 
+0

要将更新:这将取决于究竟你GROUPBY等等,都是,无论你在一个单一的计算做一些计算(分期偿还洗牌时间成本),什么洗牌的存储成本。通常,如果有足够的RAM可用,人们可以选择在set_index之后保留。 – mdurant

+0

我会检查坚持并提出一个更具体的性能问题。 – user32185

回答

0

当您使用第一种方法,DASK加载数据,并通过价值分割行的在执行任何你所要求的计算之前,选择一列(涉及将所有的光盘块混洗)。在计算长度的情况下,这都是浪费时间,因为指数师的知识,不利于与所有,但涉及该指标(例如,连接操作)进一步计算将要快得多。

在第二个版本,您声称你所选择的列索引,但没有您明确要求它DASK不洗牌的数据。如果恰好有保存在拼花元数据统计,并且每个镶块的最大/最小是这样,即它们形成一个单调系列(即,所有在第二块“IDX”的值的比都大于第一个中的值等),那么您将具有已知的分区并针对涉及该索引的某些操作优化性能,如前所述。如果这些条件没有得到满足,那么您将设置索引列,但不知道这些分区 - 这对计算长度来说也是完全正确的。