从旋转磁盘读取大 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 顺序存储。在这种情况下,您需要确保在分块时根本不会破坏后面的索引。
看到 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 顺序存储。在这种情况下,您需要确保在分块时根本不会破坏后面的索引。