【问题标题】:reading large dask.array h5py from spinning disk从旋转磁盘读取大型 dask.array h5py
【发布时间】:2017-08-19 12:01:04
【问题描述】:

看到 Matthew Rocklin 精彩的 pycon 2017 谈论 dask 并立即开始使用它。

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

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

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

【问题讨论】:

    标签: python performance dask


    【解决方案1】:

    锁定以避免磁盘抖动

    您关于多个并发读取正在破坏您的磁盘的假设对我来说似乎是明智的。要对此进行测试,您可以使用 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 顺序存储。在这种情况下,您需要确保在分块时根本不会分解后面的索引。

    【讨论】:

    • 我注意到使用lock=True 可以与dask.distributed 一起使用,但lock=threading.Lock() 不行,因为它不能被腌制。不过,分块是一个很好的建议,hdf5 文件是分块的,所以在那里进行一些调整似乎有很大帮助。数据总是在第一维以小块大小进行分块,因此应该很容易在那里进行自适应操作。
    • 分布式锁见dask.utils.SerializableLock
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2012-11-05
    • 2014-03-15
    • 2013-11-07
    相关资源
    最近更新 更多