用于循环生成MemoryError

时间:2017-10-05 17:08:05

标签: python csv for-loop out-of-memory

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文件。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

<span ng-repeat="id in movie.genre_ids">
{{movie.genre[d]}}
</span>

这相当于对我篮子里的每个鸡蛋都说,把鸡蛋加到篮子里。这是一个永远不会终止的循环,因为你将鸡蛋加到篮子上的速度与你拿走它们的速度相同。您需要创建一个新变量来包含hashtag数据,您可以将其称为“newHashtagArr”,但这并不重要。

for eachHashtag in hashtagsArr: 
    hashtagsArr.append(eachHashtag)

答案 2 :(得分: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)

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)