使用线程/多进程读取多个文件

Roc*_*oll 7 python multithreading multiprocessing

我目前正在从 FileNameList 的路径列表中提取 .txt 文件,该文件正在运行。但我的主要问题是,文件太多时速度太慢。

我正在使用此代码打印 txt 文件列表,

import os
import sys

#FileNameList is my set of files from my path
for filefolder in FileNameList: 
  for file in os.listdir(filefolder): 
    if "txt" in file:
        filename = filefolder + "\\" + file     
        print filename
Run Code Online (Sandbox Code Playgroud)

任何有关线程/多进程并使其快速阅读的帮助或建议都将被接受。提前致谢。

Rol*_*ith 5

所以你的意思是没有办法加快速度?,因为我的场景是读取一堆文件然后读取它的每一行并将其存储到数据库中

优化的第一条规则是问问自己是否应该打扰。如果您的程序只运行一次或多次优化,那是在浪费时间。

第二条规则是,你做任何事情之前,测量问题所在;

编写一个简单的程序,顺序读取文件,将它们分成几行并将它们填充到数据库中。在分析器下运行该程序以查看该程序花费大部分时间的地方。

只有这样你才知道程序的哪一部分需要加速。


不过,这里有一些提示。

  • 可以使用mmap.
  • 您可以使用multiprocessing.Pool将多个文件的读取分布在不同的内核上。但是,来自这些文件的数据最终将进入不同的进程,并且必须使用 IPC 发送回父进程。这对于大量数据具有显着的开销。
  • 在 Python 的 CPython 实现中,一次只有一个线程可以执行 Python 字节码。虽然从文件中的实际读取不受此限制,但处理结果是。因此,线程是否会提供改进是值得怀疑的。
  • 将行填充到数据库中可能始终是一个主要瓶颈,因为这就是一切都聚集在一起的地方。这有多少问题取决于数据库。它是在内存中还是在磁盘上,它是否允许多个程序同时更新它等等。


Cyp*_*ase 4

多线程或多处理不会加快速度;你的瓶颈是存储设备。

  • 想象一下,您有 10 个人(线程)每分钟将 1 桶水(数据)从一个地方(存储设备)运送到另一个地方(数据库);如果源头(存储设备)每分钟只创建1桶水(数据),那么无论有多少人(线程),每分钟只能移动1桶水(数据);事实上,由于所有的开销,拥有更多的人(线程)会减慢你的速度。 (3认同)
  • 如果您在从源头(存储设备)获取水(数据)和将其传送到目的地(数据库)之间有一个漫长的水净化(处理)步骤,那么拥有更多的人(线程)会有所帮助。那么你可以有10个人(线程)同时净化(处理)。请注意,当我说线程时,我指的是线程或进程。具体来说,在 Python 中,由于全局解释器锁 (GIL),您需要使用进程来加速计算。 (2认同)