我想处理一个庞大的文本语料库,我编写了两个主类正在调用的类。我删除了一些字段和方法以便更具可读性。
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密集型工作不是吗? 有没有我做错了?
答案 0 :(得分:1)
由于您每个线程都使用锁,因此每个线程都可能必须等待前一个线程。如果你有内存来处理它,你可以考虑将它分解为进程而不是线程。目前我无法弄清楚你的锁是什么,因为它只是你单独突出显示的一行。