【发布时间】:2018-10-26 02:45:35
【问题描述】:
我有一个相对较大的文本文件(大约 7m 行),我想在它上面运行一个特定的逻辑,我将在下面尝试解释:
A1KEY1
A2KEY1
B1KEY2
C1KEY3
D1KEY3
E1KEY4
我想统计按键出现的频率,然后将频率为 1 的输出到一个文本文件中,频率为 2 的输出到另一个文本文件中,频率高于 2 的输出到另一个文本文件中。
这是我目前拥有的代码,但它在字典上的迭代速度非常缓慢,并且越进展越慢。
def filetoliststrip(file):
file_in = str(file)
lines = list(open(file_in, 'r'))
content = [x.strip() for x in lines]
return content
dict_in = dict()
seen = []
fileinlist = filetoliststrip(file_in)
out_file = open(file_ot, 'w')
out_file2 = open(file_ot2, 'w')
out_file3 = open(file_ot3, 'w')
counter = 0
for line in fileinlist:
counter += 1
keyf = line[10:69]
print("Loading line " + str(counter) + " : " + str(line))
if keyf not in dict_in.keys():
dict_in[keyf] = []
dict_in[keyf].append(1)
dict_in[keyf].append(line)
else:
dict_in[keyf][0] += 1
dict_in[keyf].append(line)
for j in dict_in.keys():
print("Processing key: " + str(j))
#print(dict_in[j])
if dict_in[j][0] < 2:
out_file.write(str(dict_in[j][1]))
elif dict_in[j][0] == 2:
for line_in in dict_in[j][1:]:
out_file2.write(str(line_in) + "\n")
elif dict_in[j][0] > 2:
for line_in in dict_in[j][1:]:
out_file3.write(str(line_in) + "\n")
out_file.close()
out_file2.close()
out_file3.close()
我在具有 8GB 内存的 Windows PC i7 上运行它,这应该不会花费数小时来执行。这是我将文件读入列表的方式有问题吗?我应该使用不同的方法吗?提前致谢。
【问题讨论】:
-
在导出频率时是否需要保持出现的顺序?
-
顺便说一句,
filetoliststrip函数效率有点低,而且浪费内存。您将整个文件读入一个列表,然后创建一个新的剥离行列表。这些列表都不是必需的。只需遍历文件行并在阅读时剥离它们。 -
我在这里必须同意@PM 2Ring。在我看来,这是瓶颈。而且您有大文件,这意味着所有内容都保存在内存中。另外我建议更好地命名你的函数。 thisismymythicalmethod vs this_is_my_mythical_method
-
顺便说一句,您
for循环中的缩进似乎不正确。请修复它。
标签: python loops dictionary frequency large-files