我正在研究高光谱录音。总数据集大小约为1-3 TB,我想要分析的每个单独的记录/图像大约为12 GB,并且分成2000 MB文件(通常每个记录7个)。我使用在h5py数据集上调用的几个dask.array
的{{1}}将数组连接成一个da.concatenate
。我注意到CPU使用率低,IO性能差;我的系统监视器上的磁盘读取速度约为15-30 MB / s。经验表明该磁盘上的最大读/写速度约为250 MB / s(RAID-0中为2x 6 TB HDD)。
Gut感觉告诉我问题是很多线程正在读取有问题的7个文件(我猜24这是我的超线程计数),这意味着磁盘搜索正在颠覆我的IO性能。我怎样才能了解Dask正在做什么并阻止这些寻求?
版本和硬件:Ubuntu 16.04,anaconda python 3.5,dask 0.15.1(conda中的最新版本)。 2xhexa核心Intel Xeon CPU(总共24个超线程),80 GB RAM,RAID-0中的2个HDD。
答案 0 :(得分:0)
您的假设是多个并发读取正在颠覆您的磁盘对我来说似乎是明智的。要对此进行测试,您可以使用da.from_array
的lock=
关键字参数进行测试
将True
传递给此关键字会为该调用的所有访问权限创建锁定。这会有所帮助但不会控制from_array调用之间的访问。您还可以创建显式锁并直接传入。这将限制您的所有数据访问限制为一次只调用一个。
来自线程导入锁 lock = Lock()
arrays = [da.from_array(inp,lock = lock,chunks = ...)inp in inputs]
您还应确保从HDF5中提取数据的方式与HDF5存储数据的方式完全一致。没有这两个很好地对齐可以很容易地破坏I / O带宽。例如,如果您的HDF5文件根本没有分块,那么它们可能存储在C顺序中。在这种情况下,您可能希望确保在分块时根本不分解后面的索引。