从旋转磁盘读取大 dask.array h5py

reading large dask.array h5py from spinning disk

看到 Matthew Rocklin 在 pycon 2017 上关于 dask 的精彩演讲,立即不得不开始使用它。

我正在研究高光谱记录。总数据集大小约为 1-3 TB,我要分析的每个个体 recording/image 约为 12 GB,并且分为 2000 MB 文件(通常每个记录 7 个)。我使用在 h5py 数据集上调用的几个 da.from_array 中的 da.concatenate 将数组连接成一个 dask.array。我注意到 CPU 使用率低且 IO 性能差;在我的系统监视器上,磁盘读取速度约为 15-30 MB/s。经验表明此磁盘上的最大 read/write 速度约为 250 MB/s(RAID-0 中的 2x 6 TB HDD)。

直觉告诉我问题是许多线程正在读取有问题的 7 个文件(我猜是 24 个,因为那是我的超线程数),这意味着磁盘搜索正在影响我的 IO 性能。我怎样才能大致了解 Dask 正在做什么并防止这些搜索?

版本和硬件:Ubuntu 16.04,anaconda python 3.5,dask 0.15.1(conda 中的最新版本)。 2xhexa-core Intel Xeon CPU(总共 24 个超线程),80 GB RAM,RAID-0 中的 2 个 HDD。

锁定以避免抖动磁盘

你假设多个并发读取正在破坏你的磁盘对我来说似乎是明智的。要测试这一点,您可以使用 lock= 关键字参数 da.from_array

True 传递给此关键字会为该调用的所有访问权限创建一个锁。这会有所帮助,但不会控制 from_array 调用之间的访问。您还可以创建一个显式锁并直接将其传入。这将限制您的所有数据访问一次只能调用一个。

从线程导入锁 锁=锁定()

arrays = [da.from_array(inp, lock=lock, chunks=...) for inp in inputs]

将块与 HDF5 对齐

您还应该确保从 HDF5 中提取数据的方式与 HDF5 存储数据的方式保持一致。如果这两者没有很好地对齐,很容易破坏 I/O 带宽。例如,如果您的 HDF5 文件根本没有分块,那么它们可能以 C 顺序存储。在这种情况下,您需要确保在分块时根本不会破坏后面的索引。