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

时间:2014-03-21 15:26:09

标签: 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.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密集型工作不是吗? 有没有我做错了?

1 个答案:

答案 0 :(得分:1)

由于您每个线程都使用锁,因此每个线程都可能必须等待前一个线程。如果你有内存来处理它,你可以考虑将它分解为进程而不是线程。目前我无法弄清楚你的锁是什么,因为它只是你单独突出显示的一行。

Multiprocessing vs Threading Python