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