一个合适的解决方案将取决于您有哪些约束以及需要多长时间运行此操作。在
如果这是一个一次性(或不经常)的操作,并且内存使用不是一个大问题,那么这样做就足够了:visited = set() # use set for faster lookups
with open(out_filename, "w") as outfile:
with open(in_filename, "r") as infile:
for line in infile:
x = line.split()
k = (tuple(sorted(x[:2])), tuple(x[2:]))
if k not in visited:
outfile.write(line)
visited.add(k)
内存使用量取决于我们需要在^{中跟踪的唯一条目的数量。如果没有太多的重复项,那么几乎所有的数据都在内存中。在
如果内存使用成为一个问题,可以分多个阶段进行:首先通过对每行的前2个元素进行排序来预处理文件。在
把整个文件按行排序
删除重复项现在是直接进行的,因为重复项将一起出现。在
步骤2&3可以合并,因为在执行排序时比较条目时可以简单地丢弃重复项。在
如果您不介意使用shell,可以使用sort -u yourfile完成步骤2和3。在
请注意,这会更改文件中行的顺序(您提到的不是问题)。在
为了大幅减少内存使用量以牺牲某些性能为代价,可以使用基于文件的数据库来存储和查找访问过的条目(代替set())。在
您可以通过在内存中存储条目的哈希来加快速度,并且只在哈希匹配时查询数据库,以确认条目是否确实相同。散列可以很简单,比如获取每个条目的第一个字符,或者使用内置的hash()函数,或者选择一个existing hash algorithm。每种方法都是性能、哈希大小和冲突频率之间的折衷。一个好的选择取决于你的数据和你的限制。在
这需要一些努力才能找到最佳解决方案。只有当您需要经常执行此操作时才值得开始。在