Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 解决I/O界问题的最佳方法?_Python_Linux_Python 2.7_Subprocess_Joblib - Fatal编程技术网

Python 解决I/O界问题的最佳方法?

Python 解决I/O界问题的最佳方法?,python,linux,python-2.7,subprocess,joblib,Python,Linux,Python 2.7,Subprocess,Joblib,我目前正在HPC集群上运行一个代码,该代码在短时间内在同一目录的磁盘上写入几个16MB的文件,然后将其删除。它们被写入磁盘,然后按顺序删除。但是,I/O操作的总数超过20000*12000次 我使用python2.7中的joblib模块来利用在多个内核上运行代码的优势。它基本上是一个嵌套循环问题,外部循环由joblib并行,内部循环在函数中顺序运行。总的来说,这是一个20000*12000的循环 我的代码的基本框架如下 from joblib import Parallel, delayed i

我目前正在HPC集群上运行一个代码,该代码在短时间内在同一目录的磁盘上写入几个16MB的文件,然后将其删除。它们被写入磁盘,然后按顺序删除。但是,I/O操作的总数超过20000*12000次

我使用python2.7中的joblib模块来利用在多个内核上运行代码的优势。它基本上是一个嵌套循环问题,外部循环由joblib并行,内部循环在函数中顺序运行。总的来说,这是一个20000*12000的循环

我的代码的基本框架如下

from joblib import Parallel, delayed
import subprocess

def f(a,b,c,d):
    cmds = 'path/to/a/bash_script_on_disk with arguments from a,b > \
    save_file_to_disk'
    subprocess.check_output(cmds,shell=True)

    cmds1 = 'path/to/a/second_bash_script_on_disk  > \
    save_file_to_disk'
    subprocess.check_output(cmds1,shell=True)

    #The structure above is repeated several times. 
    #However I do delete the files as soon as I can using:

    cmds2 = 'rm -rf files'
    subprocess.check_output(cmds2,shell=True)

    #This is followed by the second/inner loop.

    for i in range(12000):
        #Do some computation, create and delete files in each 
        #iteration.

if __name__ == '__main__':
    num_cores = 48
    Parallel(n_jobs=num_cores)(delayed(f)(a,b,c,d) for i in range(20,000)) 

    #range(20,000) is batched by a wrapper script that sends no more \
    #than 48 jobs per node.(Max.cores available)
这段代码非常慢,瓶颈是I/O时间。这是一个将文件临时写入/dev/shm/的好用例吗?我在/dev/shm/上有34GB的tmpfs可用空间

我已经测试过的东西:

我试着在我有8个内核的笔记本电脑上以较小的规模设置相同的代码。但是,写入/dev/shm/的速度比写入磁盘的速度慢

旁注:内环也可以并行化,但是,我可用的内核数量远远少于20000个,这就是我坚持这种配置的原因。如果有更好的方法,请告诉我。

首先,不要谈论全部I/O操作,这是毫无意义的。相反,讨论IOPS和整个过程

其次,写入/dev/shm/比写入磁盘慢几乎是不可能的。请提供更多信息。您可以使用fio测试写性能,示例命令:sudo fio-name fio_test_file-rw=read-direct=1-bs=4k-size=50M-numjobs=16-group_reporting,我的测试结果是:bw=428901KB/s,iops=107225

第三,你真的写了太多的文件,你应该考虑一下你的结构。

首先,不要谈论全部的I/O操作,这是没有意义的。相反,讨论IOPS和整个过程

其次,写入/dev/shm/比写入磁盘慢几乎是不可能的。请提供更多信息。您可以使用fio测试写性能,示例命令:sudo fio-name fio_test_file-rw=read-direct=1-bs=4k-size=50M-numjobs=16-group_reporting,我的测试结果是:bw=428901KB/s,iops=107225


第三,你确实写了太多的文件,你应该考虑一下你的结构。

这取决于你的临时数据大小

如果您的内存比用于数据的内存多得多,那么是的,shm将是一个很好的存储空间。如果你打算写尽可能多的东西,那么你很可能会开始交换——这会破坏所有东西的性能


如果您可以将数据放入内存中,那么根据定义,tmpfs总是比写入物理磁盘更快。如果不是,那么会有更多的因素影响您的环境。在这种情况下,在分析器下运行代码是个好主意。

这取决于临时数据的大小

如果您的内存比用于数据的内存多得多,那么是的,shm将是一个很好的存储空间。如果你打算写尽可能多的东西,那么你很可能会开始交换——这会破坏所有东西的性能


如果您可以将数据放入内存中,那么根据定义,tmpfs总是比写入物理磁盘更快。如果不是,那么会有更多的因素影响您的环境。在这种情况下,在探查器下运行代码将是一个好主意。

多个内核不应改进I/O绑定任务,并且您可能希望高度依赖您的工作负载在I/O之前使用快速压缩算法(如C-blosc)压缩数据,然后再写入磁盘。尽管对其进行基准测试,但它可能不适用于您的用例。另一个技巧可能是为文件预先分配存储,并确保它使用顺序文件存储,但这可能只对某些POSIX操作系统有帮助,而对Windows没有帮助,对某些POSIX操作系统也没有帮助。允许POSIX_fallocate写入0以保证存储,在某些情况下,这可以有效地将写入文件所需的时间增加一倍。您可以扩展文件周围的数据流吗?例如,有什么东西可以读取它们吗?多核不应该改善I/O绑定的任务,而且您可能希望高度依赖您的工作负载,在I/O之前使用快速压缩算法(如C-blosc)压缩数据,然后再写入磁盘。尽管对其进行基准测试,但它可能不适用于您的用例。另一个技巧可能是为文件预先分配存储,并确保它使用顺序文件存储,但这可能只对某些POSIX操作系统有帮助,而对Windows没有帮助,对某些POSIX操作系统也没有帮助。允许POSIX_fallocate写入0以保证存储,在某些情况下,这可以有效地将写入文件所需的时间增加一倍。您可以扩展文件周围的数据流吗?例如,有人读过它们吗?请注意,fio行g
这个答案中的iven没有direct=1,因此内核的缓冲区缓存有可能满足所有I/O,这可能不是所需的,并且可能会扭曲结果……请注意,这个答案中给出的fio行没有direct=1,因此内核的缓冲区缓存可能不满足所有I/O期望并可能扭曲结果。。。