2017-10-05 133 views
0
with open(files, "rb") as f: 
    reader = csv.reader(f, delimiter=",") 
    totalTweets = 0 
    for i, line in enumerate(reader): 
     totalTweets += 1 
     hashtagsArr = re.findall(r"#(\w+)", line[2]) 
     for eachHashtag in hashtagsArr: 
      hashtagsArr.append(eachHashtag) 

爲什麼for循環爲大型csv文件生成內存錯誤?我只是迭代一個大的CSV文件。For循環生成MemoryError

+6

您正在將新的#標籤追加到您正在迭代的同一個#標籤列表中。對我來說,聽起來像一個永無止境的循環:'對於hashtagsArr中的每個hashtag:hashtagsArr.append(eachHashtag)'可能永遠不會終止。 – Abdou

回答

2

看看最後一個循環:

for eachHashtag in hashtagsArr: 
    hashtagsArr.append(eachHashtag) 

hashtagsArr增長一個元素每次迭代,所以這個循環永遠不會正確地打破。當數組變得太大而不能存儲在內存中時,MemoryError就會出現。

否則,你的代碼看起來不錯,枚舉懶惰迭代,所以它不會在第一次調用時將所有文件內容讀入內存。

如果你需要將所有的井號標籤保存到一個列表中,您可以修改代碼類似以下內容:

hashtags=[] 
with open(files, "rb") as f: 
    reader = csv.reader(f, delimiter=",") 
    totalTweets = 0 
    for i, line in enumerate(reader): 
     totalTweets += 1 
     hashtagsArr = re.findall(r"#(\w+)", line[2]) 
     hashtags += hashtagsArr 
0

您正確的修改後的代碼

newhashtagarr=[] 
with open(files, "rb") as f: 
    reader = csv.reader(f, delimiter=",") 
    totalTweets = 0 
    for i, line in enumerate(reader): 
     totalTweets += 1 
     hashtagsArr = re.findall(r"#(\w+)", line[2]) 
     for eachHashtag in hashtagsArr: 
      newhashtagarr.append(eachHashtag) 

1
for eachHashtag in hashtagsArr: 
    hashtagsArr.append(eachHashtag) 

這相當於說對於我籃子裏的每個雞蛋,把雞蛋加入籃子。這是一個永遠不會終止的循環,因爲您將雞蛋以相同的速度添加到籃子中,而您將它們帶走。你需要創建一個新的變量來包含hashtag數據,你可以稱之爲「newHashtagArr」,但這並不重要。

newHashtagArr = [] 
for eachHashtag in hashtagsArr: 
    newHashtagArr.append(eachHashtag)