(Это мой третий ответ, потому что я неправильно понял, что твой код делал в моем оригинале, а затем допустил небольшую, но решающую ошибку в моем втором - надеюсь, три очарования.
Редактирует : Поскольку это, кажется, популярный ответ, я внес несколько изменений, чтобы улучшить его реализацию за последние годы - большинство не слишком важно. Это так, если люди используют его в качестве шаблона,это обеспечит еще лучшую основу.
Как уже отмечали другие, ваша проблема MemoryError
наиболее вероятна, потому что вы пытаетесь прочитать все содержимое огромных файлов в память, а затем, наВдобавок к этому, фактически удваивая объем памяти, необходимый путем создания списка списков строковых значений из каждой строки.
Пределы памяти Python определяются тем, сколько физического ОЗУ и дискового пространства виртуальной памяти ваш компьютер и работаетсистема доступна. Даже если вы не используете ее все и ваша программа «работает», ее использование может быть нецелесообразным, посколькуслишком долго.
В любом случае, самый очевидный способ избежать этого - обрабатывать каждый файл по одной строке за раз, что означает, что вы должны выполнять обработку постепенно.
Для этогосохраняется список промежуточных итогов для каждого из полей.Когда это закончено, среднее значение каждого поля может быть вычислено путем деления соответствующего общего значения на количество прочитанных строк.Как только это будет сделано, эти средние значения могут быть распечатаны, а некоторые записаны в один из выходных файлов.Я также приложил сознательные усилия, чтобы использовать очень описательные имена переменных, чтобы сделать их понятными.
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()