python的内存有限制吗?我一直在使用python脚本从最小150mb大的文件中计算平均值。
根据文件的大小,我有时会遇到一个MemoryError。
MemoryError
可以为python分配更多的内存,这样我就不会遇到错误吗?
编辑:下面的代码
注意:文件大小可能相差很大(最大20GB),文件的最小大小为150mb
file_A1_B1 = open("A1_B1_100000.txt", "r") file_A2_B2 = open("A2_B2_100000.txt", "r") file_A1_B2 = open("A1_B2_100000.txt", "r") file_A2_B1 = open("A2_B1_100000.txt", "r") file_write = open ("average_generations.txt", "w") mutation_average = open("mutation_average", "w") files = [file_A2_B2,file_A2_B2,file_A1_B2,file_A2_B1] for u in files: line = u.readlines() list_of_lines = [] for i in line: values = i.split('\t') list_of_lines.append(values) count = 0 for j in list_of_lines: count +=1 for k in range(0,count): list_of_lines[k].remove('\n') length = len(list_of_lines[0]) print_counter = 4 for o in range(0,length): total = 0 for p in range(0,count): number = float(list_of_lines[p][o]) total = total + number average = total/count print average if print_counter == 4: file_write.write(str(average)+'\n') print_counter = 0 print_counter +=1 file_write.write('\n')
(这是我的第三个答案,因为我误解了您的代码在原始代码中所做的事情,然后在第二个错误中犯了一个小而关键的错误,希望这是一个魅力。
编辑 :由于这似乎是一个受欢迎的答案,多年来,我进行了一些修改以改进其实现,但大部分都不太重要。因此,如果人们将其用作模板,它将提供更好的基础。
正如其他人指出的那样,您的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()