为什么会有内存增加?

时间:2015-06-05 18:31:12

标签: python sqlite nltk

我写了下面的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来比较评论中的所有单词,并在数据库中保留具有情感意义的单词。你能告诉我出了什么问题吗?

1 个答案:

答案 0 :(得分:1)

你可以强制垃圾收集;

import gc

gc.collect()

gc.collect调用放在循环结束的某处。

一般你不应该打扰,除非你的程序消耗了所有的记忆。即使在这种情况下,通常最好使用不同的算法。

在任何情况下,在尝试优化之前,您应首先配置您的应用程序。您可以尝试memory profiler