多线程程序中效率低下的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删除。