For循环产生MemoryError

For loop generating MemoryError

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 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

你正确的修改代码 </p> <pre><code>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)

for eachHashtag in hashtagsArr: 
    hashtagsArr.append(eachHashtag)

这相当于对我篮子里的每一个鸡蛋说,把那个鸡蛋加到篮子里。这是一个永远不会终止的循环,因为您将鸡蛋放入篮子的速度与取走它们的速度相同。您需要创建一个新变量来包含主题标签数据,您可以将其命名为 "newHashtagArr" 但没关系。

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