[英]Efficient way to aggregate and remove duplicates from very large (password) lists
[英]Faster way to remove duplicates from a very large text file in Python?
我有一个非常大的文本文件,其中包含要消除的重复条目。 我不关心条目的顺序,因为文件稍后会被排序。
这是我到目前为止所拥有的:
unique_lines = set()
outfile = open("UniqueMasterList.txt", "w", encoding = "latin-1")
with open("MasterList.txt", "r", encoding = "latin-1") as infile:
for line in infile:
if line not in unique_lines:
outfile.write(line)
unique_lines.add(line)
outfile.close()
它已经运行了30分钟,还没有完成。 我需要它更快。 Python 中更快的方法是什么?
查找相应的系统命令。 在Linux / UNIX中 ,您将使用
uniq MasterList.txt > UniqueMasterList.txt
操作系统通常知道执行这些操作的最佳方法。
评论后
@Mark Ransom提醒我,uniq取决于文件中连续的匹配行。 实现此目的的最简单方法是对文件进行排序:
sort MasterList.txt | uniq > UniqueMasterList.txt
要在Python中使用与uniq
相同的技术,请执行以下操作:
import itertools
with open("MasterList.txt", "r", encoding = "latin-1") as infile:
sorted_file = sorted(infile.readlines())
for line, _ in itertools.groupby(sorted_file):
outfile.write(line)
假定整个文件将两次装入内存。 或者该文件已经排序,您可以跳过该步骤。
我建议的简单方法是使用哈希表和哈希表。您可以使用高效的哈希函数对每一行进行哈希处理,然后将其插入哈希表中,并输出count为1的内容。类似于使用来解决单词/字母计数问题哈希表。查找仅花费o(1),并且可以将内存使用量限制为恒定量,具体取决于所使用的哈希表的大小。
SPLIT_COUNT = 30
def write_data(t_file, value):
t_file.write(value)
def calculate_hash(filename, handle_file):
with open(filename, 'r') as f:
for line in f:
write_data(handle_file[hash(line)%SPLIT_COUNT], line)
def generate_file(dir):
handle_file, files = [], []
for i in range(SPLIT_COUNT):
path = dir+"split_"+str(i)
files.append(path)
f = open(path, 'w')
handle_file.append(f)
return files, handle_file
def close_file(handle_file):
for i in range(len(handle_file)):
handle_file[i].close()
def data_uniq(files, new_file):
dataset = dict()
n_file = open(new_file, 'w')
for filename in files:
f = open(filename, 'r')
for line in f:
dataset[line] = 1
f.close()
for key in dataset.keys():
n_file.write(key)
dataset = {}
n_file.close()
if __name__ == "__main__":
filename = './clean.txt'
generate_dir = './tmp/'
new_file = './out.txt'
files, handle_file = generate_file(generate_dir)
calculate_hash(filename, handle_file)
close_file(handle_file)
data_uniq(files, new_file)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.