我有一些本地二进制格式的大文件,它包含许多3D(或4D)数组作为一系列2D块。文件中的块的顺序是随机的(可以具有变量A的块17,接着是变量B的块6,等等)。我无法控制文件生成,我只是使用结果。幸运的是,这些文件包含一个目录,所以我知道所有块的位置,而不必读取整个文件。
我有一个简单的接口,可以将这些数据延迟加载到dask中,并将这些块重新构造为Array
个对象。这很好 - 我可以对数组进行切片和切块,对它们进行计算,当我最终compute()
最终结果时,块会从文件中正确加载。
但是,加载块的顺序对于这些文件不是最佳的。如果我理解正确,对于没有成本差异的任务(就依赖关系数而言?),本地线程调度程序将使用任务键名作为打破平局。这似乎导致块在Array中按逻辑顺序加载。不幸的是,我的文件不遵循逻辑顺序,因此这会导致许多数据搜索(例如,在文件的中途搜索以获取变量A的块(0,0,0)
,然后返回到开头附近以获取块{{1变量A等)。我想要做的是以某种方式控制这些块被读取的顺序,因此它们遵循文件中的顺序。
通过在(0,0,1)
上创建回调函数,我找到了适用于简单案例的kludge。它扫描start_state
状态中的任务,查找对这些数据块的任何引用,然后根据磁盘上数据的顺序重新排序这些任务。使用这个kludge,我能够将处理速度提高 3 。我猜测,当顺序读取文件时,操作系统正在进行某种预读,并且这些块足够小,可以在单个磁盘读取中拾取多个块。这个kludge足以满足我目前的使用需求,但它很丑陋而且很脆弱。对于复杂计算,它可能会对dask的优化算法起作用。在dask中是否有更好的方法来控制哪些任务在决胜局中胜出,特别是从磁盘加载块?即,有没有办法告诉dask,“所有事情都是平等的,这是我希望你处理这组块的相对顺序?”
答案 0 :(得分:0)
您的评估是正确的。截至2018-06-16,目前还没有任何方法可以添加最终的平局。在分布式调度程序(在单个计算机上可以正常工作)中,您可以使用priority=
关键字提供明确的优先级,但这些优先级优先于所有其他注意事项。