3

您如何诊断和修复涉及 Django 和 Scikit-learn 的内存泄漏?

我正在研究一个 Django 管理命令,该命令训练几个使用 scikit-learn 实现的文本分类器。我正在使用我所知道的所有技巧来解决 Django 内存泄漏问题,包括:

  1. 设置 DEBUG=False
  2. 使用 .iterator() 进行查询集迭代
  3. 使用 .defer([columns]) 防止不必要地加载巨大的列值。
  4. 通过定期调用 MyModel.objects.update() 清除缓存的查询集。
  5. 手动调用 gc.collect() 来加速垃圾收集。

这些技术解决了我过去长时间运行的 Django 进程的所有内存泄漏问题。但是,我仍然看到 scikit-learn 存在大量内存泄漏,这意味着问题可能与 Django 无关。

我的过程看起来基本上像:

tmp_debug = settings.DEBUG
settings.DEBUG = False
try:
    documents = Document.objects.all().defer('text')
    for document in documents.iterator():

        classifier = Pipeline([
            ('vectorizer', HashingVectorizer(ngram_range=(1,4))),
            ('tfidf', TfidfTransformer()),
            ('clf', OneVsRestClassifier(LinearSVC())),
        ])

        x_train = document.training_vector
        y_train = document.classification_index

        classifier.fit(x_train, y_train)

        obj, _ = SavedClassifier.objects.get_or_create(document=document)
        _, fn = tempfile.mkstemp()
        joblib.dump(classifier, fn, compress=9)
        obj.classifier = b64encode(open(fn, 'rb').read())
        os.remove(fn)
        obj.save()

        Document.objects.update()
        gc.collect()
finally:
    settings.DEBUG = tmp_debug

每个文档对象包含几页文本(在“文本”字段中)。我有大约 50 条文档记录,在解析 5 条文档后,脚本消耗了大约 4GB 的内存,并且随着时间的推移稳步增加。

有什么方法可以诊断和修复此内存泄漏,而不是为每个文档运行一次我的脚本?

4

0 回答 0