所以我用谷歌搜索了python3的多线程,并没有找到我正在寻找的东西。
我有一个python模块,它转到给定的路径并从一堆excel文件(使用openpyxl的.xlsx)中抓取数据并输出一个csv进入我的sql db。现在需要大约20-25分钟来浏览所有160多个文件(大文件,不关心每个文件本身的时间)。我将它们分成2个不同的目录,每个目录大约80个,同时运行两个空闲实例,每个目录一次('路径\ test1 \''路径\ test2 \&# 39)。
这两个python实例同时运行需要16分钟。以这种方式运行甚至扩展到4个python实例同时运行的限制/关注是什么?
从excel中抓取的数据对于每个文件都是完全独立的,因此在我合并csv输出以便稍后上传之前不需要进行任何交互。
,带有四核cpu的HP精英版
提前致谢。
顺便说一句 - 这让我对学习c#的多线程能力感兴趣。答案 0 :(得分:0)
您的Python模块的单个实例可能一次只能利用单个核心。如果您的进程受CPU限制,那么随着所有核心的使用,您将看到这种并行性的好处下降。您可能会发现,如果您的进程磁盘IO很重,那么随着IO需要根据进程数量进行扩展,您会更快地看到性能停止。
在任何一种情况下,在具有单个磁盘的四核cpu上,您将看到并行游戏的好处随着不超过几个线程/进程而下降。除了以现有方式运行脚本的几个实例之外,显然多线程这种任务可能不值得你努力。
答案 1 :(得分:0)
您的计划必须:
这些都有其自身的局限性。例如。硬盘有特定的限制:
在机械硬盘中,搜索涉及逐字地移动磁盘上的读/写磁头,然后等待正确的扇区通过磁头。在固态硬盘(SSD)中,这种机械问题不存在,这是SSD的优势之一。
但是如果您使用的磁盘驱动器确实存在寻道时间问题(所有机械磁盘),并且您运行了两个程序副本,那么您同时使用四个文件并且磁盘驱动器头必须不断从一个文件的位置移动到另一个文件。这需要时间。
然后速度有限:
运行多个程序副本可以使用更多的处理器内核..因此可以提高整体处理速度。但是,如果所有内容都存储在同一个磁盘上,那么在您遇到阅读,写入和寻求速度的限制之前,您只能走得那么远。所以,经过一个点,运行更多的流程不会有所帮助,因为那不是什么阻碍了你。
每个操作系统都有查看在任何给定时刻使用的资源的方法。在Windows中,这是"任务管理器" (性能标签)。在类似unix的系统上,有一个名为" top"的程序。在任务运行时观察这些程序,它会告诉你瓶颈在哪里(读,写,cpu,网络等)。例如,如果磁盘处于100%,CPU处于50%,那么您的程序将停留等待磁盘并运行更多进程并不能帮助您。
我有根据的猜测是,如果不将数据传播到其他硬盘上,就无法进一步优化这一点。你说你是在笔记本电脑上,所以你很可能只安装了一个硬盘,但是如果你有一个快速的外部磁盘连接(USB3 / ESATA /闪电)那么你可以通过在两者之间分配工作来加快你的过程。磁盘。
有两种方法可以将它分开..将文件分成两半,在一个磁盘上分一组,另一个在另一个磁盘上。切片的另一种方法是从一个磁盘读取所有文件,然后写入另一个磁盘。这意味着每个驱动器不必在磁盘上寻找(从轨道到轨道),因此加快了速度。
如果你只有一个USB闪存盘,你可以尝试使用它..如果它是USB3它可能会帮助你。但在这种情况下,只能从闪存驱动器中读取XLS文件,并将CSV文件写入笔记本电脑中的常规硬盘。与大多数硬盘相比,闪存驱动器的写入速度非常慢。
您已经知道,运行两个进程会加速磁盘成为限制,因此每个磁盘运行两个进程。请记住,您在同一硬盘上同时访问的文件越多,驱动器必须搜索的越多。
有些人完成了解决这些问题的全部职业。所以你必须稍微努力一点,找出你所拥有的任何硬件的最佳用途。
您想到的另一个选择是编写程序,以便不是编写然后写入数据库的CSV文件,而是直接写入数据库。这将花费更长的时间,但会消除一个步骤,以便整个工作可能花费更少的时间。
然后,还有其他方法可以优化。例如,如果您只使用一个硬盘,则可以通过读取和写入更大的块来减少搜索。例如,让我们说现在你从磁盘读取一条记录,处理它,然后把它写出来......你这样做就有1亿条记录。操作系统已经尝试优化读写行为,但是你仍然需要进行大量的读写操作。但是,如果,让我们说,您可以一次读取1000万条记录到内存中,处理它们,然后立即写出来,您可能会获得更好的性能。尽量避免做很多小的读写操作。