我写了下面的python代码。我还没有任何需要内存的数组或列表,我无法理解为什么会有内存溢出。
con = db.connect('SentiWords.db')
cur = con.cursor()
cur.execute("DROP TABLE IF EXISTS Words")
cur.execute('''CREATE TABLE Words(word Text, type Text) ''')
infile = open("train_reviews.txt")
lines = infile.readlines()
stopwords = nltk.corpus.stopwords.words('english')
sentiment_words = dict()
counter =0
for line in lines:
words = nltk.word_tokenize(line.decode("UTF-8"))
words = [ w for w in words if w.lower() not in stopwords]
for word in words:
counter_sent = 0
counter_obj = 0
check = swn.senti_synsets(word)
for i in range(0,len(check)):
if check[i].pos_score() < check[i].obj_score() and check[i].neg_score() < check[i].obj_score():
counter_obj +=1
else:
counter_sent +=1
if counter_obj < counter_sent:
cur.execute('''SELECT type FROM Words WHERE word=? ''', [word])
data=cur.fetchall() #extract frequency
if len(data) == 0: #if there isn't any frequency
cur.execute("INSERT INTO Words VALUES(?,?)", (word,"no-obj"))
if counter % 1000 == 0:
con.commit()
con.close()
con = db.connect('SentiWords.db')
cur = con.cursor()
print counter
counter +=1
con.commit()
con.close()
我想从评论中找到所有具有情感含义的词语。因此,我决定使用sentiwornet来比较评论中的所有单词,并在数据库中保留具有情感意义的单词。你能告诉我出了什么问题吗?
答案 0 :(得分:1)
你可以强制垃圾收集;
import gc
gc.collect()
将gc.collect
调用放在循环结束的某处。
但一般你不应该打扰,除非你的程序消耗了所有的记忆。即使在这种情况下,通常最好使用不同的算法。
在任何情况下,在尝试优化之前,您应首先配置您的应用程序。您可以尝试memory profiler。