Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 Scipy矩阵添加_Python_Multithreading_Scipy_Producer Consumer - Fatal编程技术网

多线程程序中效率低下的Python Scipy矩阵添加

多线程程序中效率低下的Python Scipy矩阵添加,python,multithreading,scipy,producer-consumer,Python,Multithreading,Scipy,Producer Consumer,我想处理一个巨大的文本语料库,我已经编写了两个类,一个主类正在调用。为了更具可读性,我删除了一些字段和方法 import queue import threading class Vectorizer(): def __init__(self, numThread=10): self.docQueue = Queue.Queue(self.queueMaxSize) self.words = {} self.dimension = 1024 self.mode

我想处理一个巨大的文本语料库,我已经编写了两个类,一个主类正在调用。为了更具可读性,我删除了一些字段和方法

import queue
import threading
class Vectorizer():

 def __init__(self, numThread=10):
    self.docQueue = Queue.Queue(self.queueMaxSize)
    self.words = {}
    self.dimension = 1024
    self.modelLock = threading.Lock()
    for i in range(numThread):
       t = WorkerThread(self)
       t.setDaemon(True)
       t.start()
 def vectorize(self, text):
    '''
    add the text to docQueue. here text is the content of a 
    document 
    '''
    self.docNum += 1
    docVector = createSparseVectorForThisDoc(self.docNum)
    self.docQueue.put((docVector, text))
 def initContextVector(self):
    #return sp.zeros(self.vectorizer.dimension, dtype=int)
    return csr_matrix((1, self.vectorizer.dimension), dtype=int8 )
class WorkerThread(threading.Thread):
 def __init(self, vectorizer):
       self.vectorizer = vectorizer
 def run(self):
                  #get a document/text from queue
        contextVector, text =  self.vectorizer.docQueue.get()

        #do the work
        tokens, textLength = self.prepareTokens(text)
        #extract tokens and their context in order to vectorize them.
        for token in tokens:
            self.vectorizer.modelLock.acquire()
            self.vectorizer.words[token] =    self.vectorizer.words.get(token, self.initContextVector()) + contextVector
            self.vectorizer.modelLock.release()


        self.vectorizer.docQueue.task_done()
我测量了每一条语句所花费的时间,其中使用的时间最多 在下面的代码中,它添加到稀疏矩阵中,而稀疏矩阵实际上是 两个稀疏(不是非常稀疏)向量

self.vectorizer.words[token] =    self.vectorizer.words.get(token, self.initContextVector()) + contextVector
当我使用htop检查服务器的核心时,我没有看到一个好的cpu 利用率整个流程使用130%的核心,但应使用 当我使用10个线程时,大约1000%。它从来不会超过130%,但增加的是cpu密集型的工作,不是吗?
有没有什么是我做错的?

因为您让每个线程都使用锁,所以每个线程可能都必须等待上一个线程。如果你有内存来处理它,你可以考虑把它分解成进程而不是线程。现在我不知道你的锁在后面是什么,因为它都在你单独突出显示的那一行中


谢谢,但这不是问题所在。我的代码工作正常,结果正确。我刚刚删除了一些有噪声的代码,以便主要问题更加明显。是,下划线由stackoverflow删除。