使用Python多处理包解析文本文件时出现问题

使用Python多处理包解析文本文件时出现问题,python,multiprocessing,Python,Multiprocessing,在我的一个研究项目中,我试图从170000个文本文件中计算某些单词。我有一个功能性的for循环来完成这项工作,但是看到只有20%的CPU被使用是很痛苦的: import pandas as pd import re def normalize_text(text): some process to normalize the text return text # I created a filelist dataframe prior to execute this functi

在我的一个研究项目中,我试图从170000个文本文件中计算某些单词。我有一个功能性的for循环来完成这项工作,但是看到只有20%的CPU被使用是很痛苦的:

import pandas as pd
import re
def normalize_text(text):
    some process to normalize the text
    return text
# I created a filelist dataframe prior to execute this function
def countwords(filelist):
    global wc
    header_list=['file','wda', 'wdb', 'wdc', 'wdd', 'wde','wdf']
    wc=pd.DataFrame()
    wc = wc.reindex(columns = header_list) 
    for i in range(filelist.shape[0]):
        words = ['wda', 'wdb', 'wdc', 'wdd', 'wde','wdf']
        count={}
        for elem in words:
            count[elem] = 0
        file=open(filelist.iloc[i].at['location'], encoding='latin-1')
        full=file.read()    
        text=normalize_text(full)
        for word in words:
            count[word] = len(re.findall(word,text))
        wc = wc.append(count, sort=False,ignore_index=True)
        wc=wc
我正在尝试修改代码以使用多处理软件包,查看是否可以一次处理多个文件。
我是该软件包的新手,这里有一个修改版本:

import re
def countwords(filedest):
    words = ['wda', 'wdb', 'wdc', 'wdd', 'wde','wdf']
    count={}
    for elem in words:
        count[elem] = 0
    count.update({'file' : filedest})
    file=open(filedest, encoding='latin-1')
    full=file.read()    
    text=normalize_text(full)
    for word in words:
      count[word] = len(re.findall(word,text))
    return count

mydir = os.path.join('C:\\',"filedest\*.txt")
from multiprocessing.pool import ThreadPool
import glob2

if __name__ == '__main__':
  tasks = glob2.glob(str(mydir))
  pool = ThreadPool()
  results=pool.map_async(countwords,tasks)
  pool.close()
  pool.join()
#results are handled after pool.join
我注意到代码被处理了一段不正常的时间,在键盘中断后,代码继续运行一段时间并完成了工作(但是如果我不中断,它将无限期地挂起,并爆炸我的内存)。 我尝试在processpool和threadpool之间切换,用另一个函数扭曲结果,但似乎没有任何用处。 我正在使用带有Spyder IDE的anaconda分发版。
感谢您的时间和帮助

如果Python中的线程主要需要CPU(而不是读/写文件/url),那么它们的工作速度就不会更快,因为Python使用
GIL
一次只运行一个线程。看起来您的“while True”循环将永远使用相同的参数启动任务。只要不停地打下面的电话就行了。您没有显示处理results对象的代码,但我假设您已经阅读了关于如何处理它的文档,以等待子流程完成。我认为福拉斯的评论是错误的。文档中说,多进程启动单独的进程,而不是线程,因此GIL不是问题。我使用多线程下载这些文件,它使进程大大加快,所以我一直使用它@furas@electrogas我在没有while-true语句的情况下进行了尝试,它的运行方式与旧代码一样。结果在pool.join之后聚合,这可能是问题所在吗?如果您的CPU使用率较低,这通常表示您受到IO限制。在这种情况下,添加进程以访问更多CPU不会有帮助。添加线程可能会有所帮助,但前提是瓶颈实际上是您的应用程序,而不是您正在读取的媒体。如果Python中的线程主要需要CPU(不是对文件/url的读/写),那么它们的工作速度不会更快,因为Python使用
GIL
一次只运行一个线程。这似乎是您的“while True”循环将永远使用相同的参数启动任务。只要不停地打下面的电话就行了。您没有显示处理results对象的代码,但我假设您已经阅读了关于如何处理它的文档,以等待子流程完成。我认为福拉斯的评论是错误的。文档中说,多进程启动单独的进程,而不是线程,因此GIL不是问题。我使用多线程下载这些文件,它使进程大大加快,所以我一直使用它@furas@electrogas我在没有while-true语句的情况下进行了尝试,它的运行方式与旧代码一样。结果在pool.join之后聚合,这可能是问题所在吗?如果您的CPU使用率较低,这通常表示您受到IO限制。在这种情况下,添加进程以访问更多CPU不会有帮助。添加线程可能会有所帮助,但前提是瓶颈实际上是您的应用程序,而不是您正在读取的媒体。