我试图利用python多处理库利用计算机中的多个内核来处理数百万个文件中的文本。 下面的代码显示了主路径和辅助函数,它们在输入的重新运行字(1000个以下)中使用路径,该字在路径中的所有文件中最多出现(函数没有错,仅供参考)。

    import multiprocessing as mp
    def worker(fileNameList):
        '''Takes a file name list and reruns a word frequency map of all the files in a dict'''
        vacob=dict()
        for fileName in fileNameList:
            xmlfile=open(fileName)
            tree=html.fromstring(xmlfile.read())
            paras=tree.xpath("//title/text()|//headline/text()|//text/p/text()")
            docString="".join(paras)
            wordList=preprocess_pipeline(docString)
            for word in wordList:
                if vacob.has_key(word):
                    vacob[word]=vacob[word]+1
                else:
                    vacob[word]=1
                xmlfile.close()
        output.put(vacob)


    def master(path,n=8):
        '''Takes a path as input and returns a vocabulary of(10000 or less) words for all the files in the path'''
        vacob=defaultdict(int)
        xmlFiles=[f for f in listdir(path) if isfile(join(path,f)) and os.path.splitext(f)[1]=='.xml']
        length=len(xmlFiles)
        parts=length/n
        processes=list()
        for i in range(n):
            processes.append(mp.Process(target=worker,args=[xmlFiles[i*parts:(i+1)*parts]]))
        for i in processes:
            i.start()
        for i in processes:
            i.join()

        for j in range(n):
            results=output.get()
            for word in results:
                vacob[word]+=1
        vacob=sorted(vacob,key=vacob.get,reverse=True)
        if(len(vacob)<10000):
            return vacob
        else:
            return vacob[:10000] 
    output=mp.Queue()
    vocab=master(path)

这应该利用我计算机的所有8个核心。 但是所有进程都只共享我的CPU的一个内核。下图显示了我的textprocessing.py脚本产生的所有进程都只使用一个内核。如何使脚本使用所有可用的内核?

Htop

当我尝试调试打印每个工作人员正在处理的文件时。 它似乎利用了所有核心。 但是我仍然不明白为什么简单的print语句会利用所有核心。

这是带有调试打印的修改后的代码。

    import multiprocessing as mp
    def worker(fileNameList,no):
        '''Takes a file name list and reruns a word frequency map of all the files in a dict'''
        vacob=dict()
        for fileName in fileNameList:
            print "processing ",fileName," worker",no
            xmlfile=open(fileName)
            tree=html.fromstring(xmlfile.read())
            paras=tree.xpath("//title/text()|//headline/text()|//text/p/text()")
            docString="".join(paras)
            wordList=preprocess_pipeline(docString)
            for word in wordList:
                if vacob.has_key(word):
                    vacob[word]=vacob[word]+1
                else:
                    vacob[word]=1
            xmlfile.close()
        output.put(vacob)


    def master(path,n=8):
        '''Takes a path as input and returns a vocabulary of(10000 or less) words for all the files in the path'''
        vacob=defaultdict(int)
        xmlFiles=[f for f in listdir(path) if isfile(join(path,f)) and os.path.splitext(f)[1]=='.xml']
        length=len(xmlFiles)
        parts=length/n
        processes=list()
        for i in range(n):
            processes.append(mp.Process(target=worker,args=[xmlFiles[i*parts:(i+1)*parts],i]))
        for i in processes:
            i.start()
        for i in processes:
            i.join()

        for j in range(n):
            results=output.get()
            for word in results:
                vacob[word]+=1
        vacob=sorted(vacob,key=vacob.get,reverse=True)
        if(len(vacob)<10000):
            return vacob
        else:
            return vacob[:10000] 
    output=mp.Queue()
    vocab=master(path)

这是htop和控制台的屏幕截图: 在此处输入图片说明在此处输入图片说明

  ask by gman translate from so

本文未有回复,本站智能推荐:

1回复

使用多核处理的Python代码使用32个核心而不是AWS EC2上的16个核心

我不明白为什么我的计算时间比使用28-30核心的时间长,而不是在AWS EC2 c3.8xlarge上使用12-16核心时。 我做了一些测试,结果如下图所示: https://www.dropbox.com/s/8u32jttxmkvnacd/Slika%20zaslona%202015
2回复

使用Python中的多处理功能无法打印内容

我只想从此站点运行一个示例,其代码如下: 它表示如果运行代码,则应看到以下结果: 但是当我运行这段代码时,我只看到结果Done ,仅此而已。 在该教程中,使用了Python 2.7,但我使用了3.6,并且在打印中添加了() 。 谢谢您的帮助
2回复

多核Python:多处理比。 zeroMQ?

我想编写一个python代码,将数据集作为输入加载并进行分析。 将有5个并行流程来分析数据 - 每个流程将以不同的方式处理数据。 在开始任何处理之前, master脚本(将“启动”所有不同子进程的脚本)将定义一个空列表。 我希望所有不同的进程将其输出写入上面提到的相同列表(意味
1回复

Python中的多处理无法正常工作

我正在使用lxml进行webscraping。 我在一个文件(stock_names)中有超过1000个公司名称,在另一个文件(stocks_URL)中有相同数量的URL。 这需要无休止的,超过20分钟才能完成执行。 所以,我尝试在我的程序中使用多处理概念。 对于样本测试,我使用了1
1回复

Python多重处理可在Linux中使用,但在Windows中无法使用

我有一个在Linux和Windows中都尝试过的多处理脚本 在linux中,它工作正常,但在Windows中,脚本正在运行一些随机的未知结果,并且脚本甚至没有结束 脚本 Linux输出 但是当我在Windows中运行相同的脚本时,由于linux和脚本甚至没有结束,所以
1回复

Python中的multiprocessing.dummy没有使用100%cpu

我正在用Python做一个机器学习项目,所以我必须做并行预测功能,这是我在程序中使用的功能。 问题是我所有的CPU仅加载20-40%(总和为100%)。 我使用multiprocessing.dummy,因为我在酸洗功能中的多处理模块有一些问题。
2回复

使用Python中的多处理子句

在python 3中,您现在可以使用with子句安全地打开文件with如下所示: 使用此方法,我不必担心关闭连接 我想知道我是否可以为多处理做同样的事情。 例如,我当前的代码如下所示: 有什么方法可以使用with子句来简化这个吗?
1回复

无法使用python pathos multiprocessing来腌制对象和导入模块

以下是一些玩具示例,可以重现我在Python 3.5上使用pathos.multiprocessing遇到的问题。 一个问题是,在并行处理未能认识到什么Test ,即使在Test没有内使用test() 我已经看到一些帖子解决了第二个问题,说我需要在test函数中将import numpy a
1回复

导入使用MultiProcessing Python的模块

我希望使用多处理模块来加快某些传输规划模型的运行时间。 我通过“正常”方法尽可能地优化,但其核心是一个荒谬的并行问题。 例如,执行相同的矩阵运算集,4个不同的输入集,所有独立的信息。 伪代码: 所以我真正想做的就是在四核计算机上并行处理这个循环的迭代。 我已经在这里以及多处理
1回复

Python中的Memoization,Classes和Multiprocessing

我试图使用python 2.7.2中的多处理模块进行一些计算。 我的代码是这样的: 我是新手,我基本上复制了这个页面上主要代码的格式: python prime crunching:处理池比较慢? 我是否可以在每个核心中运行进程,同时查看相同的字典以帮助他们进行计算? 它现在的行为