Dask 如何在线程调度程序中利用多线程?

How does Dask leverage multithreading in the threaded scheduler?

我对Dask的本地线程调度器很感兴趣。此调度程序可以使用多个线程从 "parallel" 中的多维数组加载数据块。我对 I/O 绑定问题感兴趣,所以我暂时不考虑计算密集型应用程序。

我使用 Dask 的存储方法从随机数组加载和保存数据时所做的一些速度测试似乎证实了这一事实:随着块大小的增加,性能下降(据说是因为最小的块增加了并行性)。在这个实验中,我正在处理没有物理块的 hdf5 文件:1 个数据集包含数组中的所有数据。

我有两个问题: 1)当硬盘是顺序读取时,Dask 读取数据如何并行? 2)当python GIL 应该阻止线程同时在内存中保存数据时,Dask 如何在读取时具有并行性?

感谢您的宝贵时间。

How can Dask have parallelism in reading data when reading on HDD is sequential?

你是对的,如果你受限于从硬盘读取,那么使用多线程应该不会有任何性能优势。

不过,这里可能除了读取硬盘之外还有其他工作要做。

  • 您的数据可能以 HDF 格式压缩,需要一些 CPU 工作来解压缩它
  • 除了读取数据之外,您可能正在对数据执行某些操作,并且这些操作可以与 IO 任务交错

How can Dask have parallelism in reading when the python GIL should prevent the threads from saving data in memory at the same time?

Python 的 GIL 对于数字工作负载来说并不是什么大问题,它们的大部分计算都是在链接的 C/Fortran 库中进行的。一般来说,如果您在数字数据上使用类似 Numpy 的库,那么 GIL 不太可能影响您。