简单的 Python Nest For 循环会耗尽内存

我有一个从 CSV 文件中读取的四元组列表,其元素的形式为 t =(id, e1, e2, label)。该列表应包含每个 t 元组:(someID, e2,e1, 3-label)。如果没有,我需要添加到列表中。


我编写了以下代码并将我的列表缩小到只有 50 个元组。


import nltk

import csv

#file string

fs = "mydataset.csv"

with open(fs) as infile:

    rows = list(csv.reader(infile))[950:1000]

    size = len(rows)

    print("initial size =", size)

    newSize = size

    firstId = int(rows[1][0])

    lastId = int(rows[size-1][0])

    for i in range(size):

        if i % 500 == 0:

            rint("program progression = ", i*100/size, '%', sep ='')

        tempRow = rows[i]

        if tempRow[-1] == '1' or tempRow[-1] == '2':

                for j in range(i+1, size):

                # print("j = ", j)

                    if tempRow[1] == rows[j][2] and tempRow[2] == rows[j][1]:

                        if int(tempRow[3]) == 3-int(rows[j][3]):

                            break

                        else:

                            print("error in row: ", i)

                    else:

                        if j == size -1:

                            lastId +=1

                            print(tempRow[-1])

                            rows += rows +[[ str(lastId), tempRow[2], tempRow[1], str(3-int(tempRow[3])) ]]

                            newSize +=1

                            print("newSize", newSize)

    print("END")

当我运行它时,它会耗尽我的内存。它使用超过8GB的内存?请问这是怎么回事?我的 CSC 文件只有 7200 行 4 列。我真的不知道我还能做什么。


胡子哥哥
浏览 180回答 2
2回答

万千封印

不知道,但这条线看起来很可疑:rows += rows +[[ str(lastId), tempRow[2], tempRow[1], str(3-int(tempRow[3])) ]]我无法猜测您在这里尝试做什么,但是这条线不太可能实现您的意图。这使每次执行的长度增加了一倍rows多,并且您的代码中似乎没有任何内容可以减少rows.使理解要点变得非常简单:>>> rows = [1]>>> for i in range(20):...     rows += rows...     print(i, len(rows))显示:0 21 42 83 164 325 646 1287 2568 5129 102410 204811 409612 819213 1638414 3276815 6553616 13107217 26214418 52428819 1048576

皈依舞

非常感谢!你说对了。我不得不做删除+!rows = rows +[[ str(lastId), tempRow[2], tempRow[1], str(3-int(tempRow[3])) ]]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python