Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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 手动运行多个程序实例的好处_Python - Fatal编程技术网

Python 手动运行多个程序实例的好处

Python 手动运行多个程序实例的好处,python,Python,所以我在Google上搜索了python3的多线程,但没有找到我想要的东西 我有一个python模块,它指向给定的路径,从一堆excel文件(.xlsx使用openpyxl)中提取数据,并输出一个csv以进入我的sql数据库。目前,浏览所有160多个文件(大文件,与每个文件本身的时间无关)需要约20-25分钟。我将它们分成两个不同的目录,每个目录大约80个,同时在每个目录中运行两个空闲实例('path\test1\'和'path\test2\') 这两个python实例同时运行,耗时16分钟。以

所以我在Google上搜索了python3的多线程,但没有找到我想要的东西

我有一个python模块,它指向给定的路径,从一堆excel文件(.xlsx使用openpyxl)中提取数据,并输出一个csv以进入我的sql数据库。目前,浏览所有160多个文件(大文件,与每个文件本身的时间无关)需要约20-25分钟。我将它们分成两个不同的目录,每个目录大约80个,同时在每个目录中运行两个空闲实例('path\test1\'和'path\test2\')

这两个python实例同时运行,耗时16分钟。以这种方式运行,甚至扩展到同时运行4个python实例,有哪些限制/问题

笔记:
  • 从excel中获取的数据对于每个文件都是完全独立的,因此在我合并csv输出以便稍后上传之前,不需要交互

  • 在工作笔记本电脑上,HP elitebook配备四核cpu

提前谢谢


顺便说一句,这让我对学习c感兴趣,因为它具有多线程功能

Python模块的单个实例一次可能只能利用单个核心。如果您的进程是CPU受限的,那么随着所有内核的利用,您将看到这种并行性的好处在下降。您可能会发现,如果您的进程占用大量磁盘IO,那么随着IO需要随着进程数量的增加而扩展,您的性能会更快地下降

在任何一种情况下,在一个只有一个磁盘的四核cpu上,您都会看到并行化的好处随着线程/进程的减少而减少。除了以现有的方式运行脚本的几个实例之外,您可能不值得显式地多线程执行此类任务。

您的程序必须:

  • 将数据从硬盘读取到内存中
  • 在内存中进行一些处理(解析数据)
  • 将新数据从内存写入硬盘驱动器
每种方法都有其自身的局限性。。硬盘驱动器有特定的限制:

  • 它从磁盘读取数据的速度有多快
  • 它写入磁盘的速度有多快
  • 驱动器“搜索”的速度。将磁头从磁盘的一个部分移动到另一个部分,并找到正确的扇区。当您同时访问多个不同的文件时,这一点更为重要
在机械硬盘中,查找实际上包括在磁盘上移动读/写磁头,然后等待正确的扇区通过磁头下方。在固态驱动器(SSD)中,不存在这种机械问题,这是SSD的优点之一

但是,如果您使用的磁盘驱动器确实存在寻道时间问题(所有机械磁盘),并且您运行两个程序副本,那么您将同时使用四个文件,并且磁盘驱动器头必须不断地从一个文件的位置移动到另一个文件的位置。这需要时间

然后对以下各项的速度进行限制:

  • 将数据移入和移出内存
  • 处理器处理数据的速度
运行程序的多个副本可以使用处理器的多个内核。。因此,您可以提高总体处理速度。但是如果所有东西都存储在同一个磁盘上,那么在读、写和查找速度受到限制之前,你只能走这么远。因此,在一点之后,运行更多的进程不会有帮助,因为这并不是阻碍您前进的原因

每个操作系统都有查看在任何给定时刻使用的资源的方法。在Windows中,这是“任务管理器”(性能选项卡)。在类unix系统上,有一个名为“top”的程序。在任务运行时观察这些程序,它会告诉您瓶颈在哪里(读、写、cpu、网络等)。例如,如果磁盘为100%,CPU为50%,那么您的程序将无法等待磁盘,运行更多进程对您没有帮助

我有根据的猜测是,如果不将数据分散到其他硬盘上,就无法进一步优化此功能。你说你在笔记本电脑上,所以你很可能只安装了一个硬盘,但是如果你有一个快速的外部磁盘连接(USB3/ESATA/lightning),那么你可能可以通过在磁盘之间分割作业来加快进程

有两种方法可以分割它。。将文件一分为二,在一个磁盘上设置一组,在另一个磁盘上设置另一组。另一种方法是从一个磁盘读取所有文件,然后写入另一个磁盘。这意味着每个驱动器不必在磁盘上寻找(从一个磁道移动到另一个磁道),因此速度更快

如果你只有一个USB闪存驱动器,你可以尝试使用它。。如果是USB3,它可能会帮助你。但在这种情况下,只能从闪存驱动器读取XLS文件,并将CSV文件写入笔记本电脑的常规硬盘。与大多数硬盘相比,闪存驱动器的写入速度非常慢

您已经知道,运行两个进程会将速度提高到磁盘成为限制的程度,因此每个磁盘运行两个进程。请记住,您同时在同一硬盘上访问的文件越多,驱动器需要查找的文件就越多

有些人一生都致力于解决这类问题。。因此,您必须对其进行一点操作,以找出您所拥有的任何硬件的最佳用途

您想到的另一个选项是编写程序,这样就不用编写CSV文件然后写入数据库,而是直接写入数据库。这将花费更长的时间,但消除了一个步骤,因此整个工作可能需要更少的时间

然后,还有其他优化方法。例如,如果您只能使用一个硬盘,您可以通过读取和写入较大的数据块来减少查找。比如说,现在你读了一篇