python - python列表中的内存泄漏问题

标签 python list optimization product itertools

身份列表包含一个大约为 的大数组。 57000 张图片 .现在,我正在itertools.product() 的帮助下创建负面 list 。 .这将整个列表存储在内存中,这非常昂贵,并且我的系统在 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])
内存截图。
enter image description here

最佳答案

产品 来自 迭代工具 generator所以自然它不会将整个列表存储在内存中,而是在下一行中,cross_product = list(cross_product)您将其转换为将整个数据存储在内存中的列表对象。
生成器的想法是,您不会像调用 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]])
这个想法是实时写你的行
也检查此链接 how to write the real time data into csv file in python
@9mat 的一些功劳, @cybot而这些问题How to get Cartesian product in Python using a generator? , how to write the real time data into csv file in python

关于python - python列表中的内存泄漏问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65855793/

相关文章:

python - “_RSAPublicKey”对象在python中没有属性 'sign'

c - 将 void* 指针转换为 char* 指针并对其进行指针算术运算是否有效?

c++ - 查找一个数字是否是其他数字的公倍数

python - Python 中的约束整数优化

python - 从子模块上的模块调用函数

python:ValueError:关闭文件上的I/O操作

python - ValueError : Expected 2D array, 在 svm 识别期间得到一维数组

c# - 基于键 c# 合并两个列表

java - 当我们有空列表时如何使用空列表

ms-access - Access - 从表单中的图像控件导出图像