控制在调度程序中加载块的决胜选择?

Control the tie-breaking choice for loading chunks in the scheduler?

我有一些本地二进制格式的大文件,其中包含许多 3D(或 4D)数组作为一系列 2D 块。文件中块的顺序是随机的(可能有变量 A 的块 17,然后是变量 B 的块 6,等等)。我无法控制文件生成,我只是在使用结果。幸运的是,这些文件包含 table 的内容,因此我无需读取整个文件就知道所有块的位置。

我有一个简单的接口来将这些数据延迟加载到 dask 中,并将块重新构造为 Array 个对象。这工作正常 - 我可以对数组进行切片和切块,对它们进行计算,当我最终 compute() 最终结果时,块将从文件中适当地加载。

但是,块的加载顺序对于这些文件来说并不是最佳的。如果我理解正确的话,对于没有成本差异的任务(就# of dependencies 而言?),本地线程调度程序将使用任务键名作为决胜局。这似乎导致块以其在数组中的逻辑顺序加载。不幸的是,我的文件不遵循逻辑顺序,因此这导致多次查找数据(例如,在文件的中途查找以获取变量 A 的块 (0,0,0),然后返回接近开始的位置以获取块 (0,0,1) 变量 A 等)。我想做的是以某种方式控制这些块被读取的顺序,因此它们遵循文件中的顺序。

通过在 start_state 上创建回调函数,我发现了一个适用于简单案例的组合。它扫描处于 'ready' 状态的任务,查找对这些数据块的任何引用,然后根据磁盘上数据的顺序重新排序这些任务。使用这个 kludge,我能够将处理速度提高 3 倍。我猜 OS 正在按顺序读取文件时进行某种预读,并且块足够小,可以在一次磁盘读取中拾取多个块。这个 kludge 足以满足我目前的使用,但是,它又丑又脆。它可能会与 dask 的复杂计算优化算法相悖。在 dask 中有没有更好的方法来控制哪些任务在决胜局中获胜,特别是从磁盘加载块?即,有没有办法告诉 dask,"all things being equal, here's the relative order I'd like you to process this group of chunks?"

您的评价是正确的。截至 2018-06-16,目前没有任何方法可以添加最终决胜局。在分布式调度程序(在单台机器上运行良好)中,您可以使用 priority= 关键字提供明确的优先级,但这些优先级高于所有其他考虑因素。