我写了一个Python程序,它作用于一个大的输入文件,创建了几百万个表示三角形的对象.算法是:
在打印三角形之前打印出完整的顶点列表的OFF的要求意味着在将输出写入文件之前我必须在内存中保存三角形列表.与此同时,由于列表的大小,我遇到了内存错误.
告诉Python我不再需要某些数据的最佳方法是什么,它可以被释放?
我在 python 上使用“spacy”进行文本文档词形还原。有 500,000 个文档的大小高达 20 Mb 的干净文本。
问题如下:spacy 内存消耗随着时间的推移而增长,直到使用整个内存。
我的硬件配置: CPU:Intel I7-8700K 3.7 GHz(12 核)内存:16 Gb SSD:板载 1 Tb GPU,但不用于此任务
我正在使用“多处理”在多个进程(工人)之间拆分任务。每个工作人员都会收到一份要处理的文件列表。主进程执行子进程的监视。我在每个子进程中启动一次“spacy”,并使用这个 spacy 实例来处理 worker 中的整个文档列表。
内存跟踪说明如下:
[内存跟踪 - 前 10 名]
/opt/develop/virtualenv/lib/python3.6/site-packages/thinc/neural/mem.py:68: size=45.1 MiB, count=99, average=467 KiB
/opt/develop/virtualenv/lib/python3.6/posixpath.py:149: size=40.3 MiB, count=694225, average=61 B
:487:大小=9550 KiB,计数=77746,平均值=126 B
/opt/develop/virtualenv/lib/python3.6/site-packages/dawg_python/wrapper.py:33: size=7901 KiB, count=6, average=1317 KiB
/opt/develop/virtualenv/lib/python3.6/site-packages/spacy/lang/en/lemmatizer/_nouns.py:7114: size=5273 KiB, count=57494, average=94 B
prepare_docs04.py:372:大小=4189 KiB,计数=1,平均值=4189 KiB
/opt/develop/virtualenv/lib/python3.6/site-packages/dawg_python/wrapper.py:93: size=3949 KiB, count=5, average=790 KiB
/usr/lib/python3.6/json/decoder.py:355: size=1837 KiB, count=20456, average=92 B …
我的 TensorFlow 1.14 出现内存泄漏。我参考了 TensorFlow 的各种 GitHub 问题和内存泄漏来解决我的问题,我遵循了答案的建议,这似乎解决了问题。但是,它在这里不起作用。我什至将代码移植到 Tensorflow 2.1 和 2.3,但仍然无法解决问题。
每当我加载模型时,就会出现内存泄漏。我尝试在加载模型并使用垃圾收集 API 后清除会话,但泄漏仍然存在。
为了重现内存泄漏,我创建了一个简单的示例。我使用下面的函数来检查 python 进程使用的内存。
def memory_usage_func():
import os
import psutil
process = psutil.Process(os.getpid())
mem_used = process.memory_info()[0] >> 20
print("Memory used:", mem_used)
return mem_used
Run Code Online (Sandbox Code Playgroud)
下面是加载模型和检查内存使用情况的函数:
for i in range(100):
model = load_model('./model_example.h5', compile=False)
del model
memory_usage_func()
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,内存泄漏问题仍然存在。此外,我尝试进行预测。为此,我创建了一个会话,加载模型并运行 predict()。我也面临同样的内存泄漏问题。我使用tf.keras.backend.clear_session()和gc.collect()模型加载后。但是,它无法清除会话并释放内存。