用dask并行读取文件

时间:2019-02-24 08:43:42

标签: multithreading dask

我有一个关于延迟装饰的问题,它似乎与以下问题类似:“ Dask:如何将我的代码与延迟的dask并行化?” 但即使在那里也没有答案。我有以下代码:

@dask.delayed
def remove_unnessasey_data(temp,l1):
    do some work
    return temp

@dask.delayed
def change_structure(temp):
    do some work
    return temp1

@dask.delayed
def read_one(filename):
    return pd.read_csv(filename)

然后:

def f(filenames):
    results = []
    for filename in filenames:
        results.append(change_structure( remove_unnessasey_data(
            read_one(filename),l1)))

    return results

result = dask.compute(*result)

根据this,它应该提高速度,但是如果我从大文件中读取大块数据,速度是相同的,谁能解释为什么? 我知道GIL,但根据文档,它应该提高速度

1 个答案:

答案 0 :(得分:0)

  

据此应该提高速度

伙计。该文档缺乏更好的用词,通常是错误的。

说并行执行IO通常会提高性能,这显示了对大多数文件系统和磁盘存储系统如何工作的严重误解。

为什么?

寻找时间。

通常,文件系统以尽可能连续的块形式存储文件。要读取文件中的位置X,首先必须将磁盘头放在保存扇区X所在的轨道上。这需要时间。然后,系统必须等待,直到该扇区在磁盘头下方旋转。这又需要时间。

显而易见的是,为什么从旋转的磁盘顺序读取文件的速度更快-要读取扇区N,磁盘头必须首先搜索包含扇区N的磁道。但是由于文件是尽可能连续存储的,因此包含扇区N的磁道也可能包含扇区N + 1,N + 2,N + 3等。将磁盘(磁盘通常不是愚蠢的设备-它们是具有内置缓存系统的成熟IO计算机)和文件系统同时进行的预读缓存处理,然后从旋转中依次读取文件磁盘往往会减少查找数据所花费的时间。

现在尝试并行阅读。

线程A读取扇区X。磁盘试图跟踪,等待扇区X通过磁头。发生这种情况时,线程B尝试读取扇区Y。磁盘最终读取到扇区X,但是具有挂起的命令来读取扇区Y。现在磁盘必须将磁头移到正确的轨道,也许放弃了将要进行的预读对于线程A的下一次读取,获取扇区X + 1,等待磁头移动,然后等待扇区Y在磁头下方通过以进行读取。

同时,线程C发出读取扇区Z的请求...

磁盘头在磁盘上起舞。然后等待适当的扇区通过头部。

通过这种IO模式,可以将标称支持100 MB /秒的IO速率的典型消费级5400 RPM SATA磁盘每秒减少至几个 KILOBYTES

并行读取或写入数据几乎不会增加速度,尤其是在旋转磁盘上使用标准文件系统的情况下。

如果单线程的IO不会使存储系统(不仅是磁盘,而且是从CPU到磁盘的整个路径)不饱和,则使用SSD可以获得更好的性能。许多主板具有廉价,慢速的磁盘控制器和/或缺少IO带宽。购买计算机时,有多少人完全忽略磁盘控制器或主板的IO带宽?

有些文件系统确实支持并行IO以提高性能。它们往往是专有的,昂贵的且快速IBM's Spectrum Scale(最初是GPFS)和Oracle's HSM (originally SAMFS/QFS)是两个示例。