from sentence_transformers import SentenceTransformer
import emoji
import threading, json
import time
import gc
import objgraph
model2 = SentenceTransformer('distiluse-base-multilingual-cased')
#限制线程的最大数据
def tfc(i):
print("当前第 {i} 个任务正在执行")
res="360儿童手表6C最大的亮点是远程智能拍照,搭载一颗30万像素的高清摄像头,家长可通过360儿童卫士APP远程控制手表拍照,当孩子遇到危险时一键SOS报警,手表将自动开启摄像头进"
countvector =model2.encode([res])[0] #获取句向量
print(len(countvector))
def stat():
while True:
thread_list = []
for i in range(int(10)):
t1 = threading.Thread(target= tfc, args=(1,))
thread_list.append(t1)
for t in thread_list:
t.setDaemon(True) # shifou
t.start()
for t in thread_list:
t.join()
thread_list.remove(t) # 待执行结束删除子进程
time_stamp = int(time.time()) # 获取当前时间的时间戳
time_str =time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time_stamp)) # 输出 2021-09-10 09:49:15
print(time_str)
print('线程完成')
time.sleep(1)
stat()
代码运行内存会一直增加,知道出现pycharm进程已结束,退出代码 -1073741819 (0xC0000005),上
方法 tfc() 单独无限循环,内存不会一直增加,用上多线程就会内存溢出
解决多线程获取句向量溢出问题
你这个while True死循环啊,一直在无线创建线程,然后执行,释放继续创建......肯定出不来,
死循环了,去掉 while True就好了
全局的 list容器,不停的插入对象,并且未删除被循环引用的del方法,就会发生内存泄露。使用gc模块试试,最常用就是gc.collect()方法import gc,使用collect方法对循环引用的对象进行垃圾回收。总感觉这块有点问题,为什么用两个循环进行判断开始和释放呢?