python列表中的内存泄漏问题

身份列表包含大约57000 张图像的大数组。现在,我正在借助itertools.product(). 这将整个列表存储在内存中,这非常昂贵,并且我的系统在 4 分钟后挂起。

如何优化以下代码并避免节省内存?`

for i in range(0, len(idendities) - 1):
    for j in range(i + 1, len(idendities)):
        cross_product = itertools.product(samples_list[i], samples_list[j])
        cross_product = list(cross_product)

        for cross_sample in cross_product:
            negative = []
            negative.append(cross_sample[0])
            negative.append(cross_sample[1])
            negatives.append(negative)
            print(len(negatives))

negatives = pd.DataFrame(negatives, columns=["file_x", "file_y"])
negatives["decision"] = "No"

negatives = negatives.sample(positives.shape[0])

内存9.30会越来越高,有一点系统已经完全挂了。

我还根据他的回答实现了以下答案并修改了代码。

for i in range(0, len(idendities) - 1):
    for j in range(i + 1, len(idendities)):
        for cross_sample in itertools.product(samples_list[i], samples_list[j]):
            negative = [cross_sample[0], cross_sample[1]]
            negatives.append(negative)
            print(len(negatives))

negatives = pd.DataFrame(negatives, columns=["file_x", "file_y"])
negatives["decision"] = "No"

第三版代码

即使您打开一个文件,这个 CSV 文件也太大了,然后它会警告您的程序无法加载所有文件。关于过程,十分钟,然后再次系统将完全挂起。

for i in range(0, len(idendities) - 1):
    for j in range(i + 1, len(idendities)):
        for cross_sample in itertools.product(samples_list[i], samples_list[j]):
            with open('/home/khawar/deepface/tests/results.csv', 'a+') as csvfile:
                writer = csv.writer(csvfile)
                writer.writerow([cross_sample[0], cross_sample[1]])
            negative = [cross_sample[0], cross_sample[1]]
            negatives.append(negative)

negatives = pd.DataFrame(negatives, columns=["file_x", "file_y"])
negatives["decision"] = "No"

negatives = negatives.sample(positives.shape[0])

内存截图。

回答

产品itertools是一个发电机所以自然也剂量不会存储在内存中的整个列表,但在接下来的线,cross_product = list(cross_product)将其转换到整个数据存储在你的记忆列表对象。

生成器的想法是您不会像处理 call 那样同时进行所有计算list(itertools.product(samples_list[i], samples_list[j]))。所以你要做的就是一一生成结果:

尝试这样的事情:

for i in range(len(idendities) - 1):
    for j in range(i + 1, len(idendities)):
        for cross_sample in itertools.product(samples_list[i], samples_list[j]):
            # do something ...

所以我想我发现了你的问题;您首先将所有样本附加到否定列表中,因为您的内存会越来越高,您需要实时写入每一行,一次一行;

你的数据是csv吧?所以你可以这样做:

import csv
for i in range(0, len(idendities) - 1):
    for j in range(i + 1, len(idendities)):
        for cross_sample in itertools.product(samples_list[i], samples_list[j]):

            with open('results.csv', 'a+') as csvfile:
                writer = csv.writer(csvfile)
                writer.writerow([cross_sample[0], cross_sample[1]])

这个想法是实时写你的行

也检查此链接如何将实时数据写入 python 中的 csv 文件

有些学分@ 9mat,@cybot以及这些问题如何使用发电机获得笛卡尔积在Python?,如何在python中将实时数据写入csv文件


以上是python列表中的内存泄漏问题的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>