Multithreading 用dask并行读取文件
我有一个关于延迟装饰的问题,它可能类似于下面的问题“Dask:如何将我的代码与Dask delayed并行?” 但即使在那里,也没有人回答。我有以下代码:Multithreading 用dask并行读取文件,multithreading,dask,Multithreading,Dask,我有一个关于延迟装饰的问题,它可能类似于下面的问题“Dask:如何将我的代码与Dask delayed并行?” 但即使在那里,也没有人回答。我有以下代码: @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.dela
@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)
据我所知,它应该提高速度,但如果我从大文件中分块读取,速度是一样的。有人能解释为什么吗??
我知道GIL,但根据文件,它应该提高速度
根据这一点,它应该提高速度
胡说。由于缺少更好的词语,该文档总体上是错误的
说并行执行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磁盘可以减少到每秒几千字节
并行读取或写入数据几乎不会提高速度,尤其是在旋转磁盘上使用标准文件系统时
如果单个线程的IO不会使存储系统(不仅是磁盘,还有从CPU到磁盘的整个路径)饱和,那么使用SSD可以获得更好的性能。很多主板都有便宜、速度慢的磁盘控制器和/或缺乏IO带宽。有多少人在购买电脑时完全忽略了磁盘控制器或主板的IO带宽
有些文件系统确实支持并行IO以提高性能。它们往往是专有的、昂贵的、快速的。(最初是GPFS)和是两个示例
根据这一点,它应该提高速度
胡说。由于缺少更好的词语,该文档总体上是错误的
说并行执行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磁盘可以减少到每秒几千字节
并行读取或写入数据几乎不会提高速度,尤其是在旋转磁盘上使用标准文件系统时
如果单个线程的IO不会使存储系统(不仅是磁盘,还有从CPU到磁盘的整个路径)饱和,那么使用SSD可以获得更好的性能。很多主板都有便宜、速度慢的磁盘控制器和/或缺乏IO带宽。有多少人完全忽略了磁盘控制器或服务器的IO带宽