在芹菜任务中共享巨大的分类器对象

时间:2016-03-07 14:26:36

标签: python scikit-learn celery shared-memory pickle

我有一个~200MB的泡菜对象(分类器)。我尝试使用静态成员变量初始化对象并运行芹菜任务。 Celery创建了大约8个新进程,每个进程将对象读入内存并冻结我的计算机。是否存在任何共享对象解决方案或此问题的任何解决方案。

我正在尝试使用此对象对文章进行分类,并将其作为后台任务保存在db中。

EDIT。 这是我的分类器任务

的代码
from model import Article
import cPickle as pkl
from classifierclasses import Remover, Classifier, ItemSelector, PreProcessor
from celery import Celery
app = Celery('tasks', backend='redis://localhost/')

class ClassiferTask(app.Task):
    classifier = pkl.load(open('clf.p', 'rb')) #loading classifier  object initially (huge file)
    def classify(self, article_id, text):
        self.prediction = ClassiferTask.classifier.predict([text])[0]
        Article.update(prediction=self.prediction, is_analyzed=1).where(Article.id == article_id).execute()

    def run(self, id, *args, **kwargs):
        self.classify(id, args[0])

当我将这份工作提交给芹菜时,它创建了新的流程,每个流程都试图读入内存并占用大量内存~200MB * 8

我该如何解决这个问题?有没有更好的解决方案来解决这个问题。是否有芹菜任务可以共享一个(只读)对象。

1 个答案:

答案 0 :(得分:0)

共享内存很棘手。

最好的方法可能是将对象存储在某种存储中并对其进行重组以允许对其较小部分进行读/写。

无法说明如何最好地执行此操作,因为您未提供有关对象或其接口或结构的详细信息。