(这是我的第三个答案,因为我误解了你的代码在我的原创中做了什么,然后在我的第二个希望三个人的魅力中做了一个小但关键的错误.
编辑:由于这似乎是一个受欢迎的答案,我已经做了一些修改,以改善其实施多年 – 大多不太重要.这是如果人们用它作为模板,它将提供更好的基础.最大的最近的变化是删除一个生成器函数,以便在第一行偷看之后重新放回该文件.)
正如其他人所指出的那样,你的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()