2017-10-05 130 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)