(这是我的第三个答案,因为我误解了您在我的原始代码中所做的工作,然后在我的第二个答案中犯了一个小而关键的错误,希望第三个是一个魅力。
编辑:因为这似乎是一个流行的答案,所以我做了一些修改,以改进其实现,这些年来大多数都不太重要。因此,如果人们把它作为模板,它将提供一个更好的基础。
正如其他人所指出的,您的MemoryError问题很可能是因为您试图将大型文件的全部内容读入内存,然后,除此之外,通过从每行创建一个字符串值列表,有效地将所需的内存量加倍。
Python的内存限制取决于计算机和操作系统有多少可用的物理ram和虚拟内存磁盘空间。即使你没有完全使用它,你的程序“工作”,使用它可能是不切实际的,因为它需要太长的时间。
无论如何,最明显的避免方法是一次只处理一行文件,这意味着您必须以增量方式进行处理。
为此,将保留每个字段的运行总计列表。完成后,可以通过将相应的总值除以读取的总行数来计算每个字段的平均值。完成后,可以打印出这些平均值,并将一些平均值写入其中一个输出文件。我也有意识地尝试使用非常描述性的变量名,以使其易于理解。try:
from itertools import izip_longest
except ImportError: # Python 3
from itertools import zip_longest as izip_longest
GROUP_SIZE = 4
input_file_names = ["A1_B1_100000.txt", "A2_B2_100000.txt", "A1_B2_100000.txt",
"A2_B1_100000.txt"]
file_write = open("average_generations.txt", 'w')
mutation_average = open("mutation_average", 'w') # left in, but nothing written
for file_name in input_file_names:
with open(file_name, 'r') as input_file:
print('processing file: {}'.format(file_name))
totals = []
for count, fields in enumerate((line.split('\t') for line in input_file), 1):
totals = [sum(values) for values in
izip_longest(totals, map(float, fields), fillvalue=0)]
averages = [total/count for total in totals]
for print_counter, average in enumerate(averages):
print(' {:9.4f}'.format(average))
if print_counter % GROUP_SIZE == 0:
file_write.write(str(average)+'\n')
file_write.write('\n')
file_write.close()
mutation_average.close()