2015-06-05 103 views
-2

我寫了下面的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

您是否介意包含錯誤信息,以便我們可以更好地幫助您? – mmenschig

+0

我沒有收到錯誤消息,因爲我有足夠的內存來保存所需的所有數據,但是我看到任務管理器,並且內存增加了,沒有任何理由!感謝您的回覆 –

+1

如果我正確理解了您的話,您並沒有真正遇到按定義「溢出」。 Python是一種垃圾收集語言,因此內存使用量不是確定性的。您正在創建佔用空間的對象,並且垃圾收集只能在按空間時運行,因此會導致永久增加內存使用量。 – Cu3PO42

回答

1

你可以force垃圾收集;

import gc 

gc.collect() 

gc.collect調用放到循環結尾的某處。

但是一般你不應該打擾除非你的程序正在消耗你所有的內存。即使在這種情況下,使用不同的算法通常也會更好。

無論如何你應該簡介你的應用先試試優化吧。你可以試試memory profiler

相關問題