身份列表包含一个大约为 的大数组。 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])
内存截图。 最佳答案
产品 来自 迭代工具 是 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/