关于过滤/排序大文件的Python建议?

2024-04-20 10:28:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含大约2000万行(~1.5GB)的文件。每行的格式如下:

entry_1 entry_2 entry_3 ......... entry_5

文件包含重复项,但格式为:

^{pr2}$

有些行的内容是相同的,但是前两个元素经常(可能总是)切换。在

有人对如何从这种大小的文件中删除这种性质的副本有什么建议吗?在

谢谢。在


Tags: 文件元素内容格式副本建议entry性质
2条回答
separator = " "
aSet = set()
with open('myfile', 'rU') as infile:
    for line in infile:
        tempLine = line.split(separator)
        tempLine = tempLine[1:2] + tempLine[0:1] + tempLine[2:]
        tempLine = separator.join(tempLine)
        if line not in aSet and tempLine not in aSet:
            aSet.add(line)

现在,aSet包含唯一的行列表,不管entry_1和{}是否被交换。在

编辑:如果所有条目都可以交换,并且行仍然被认为是唯一的,则:

^{pr2}$

一个合适的解决方案将取决于您有哪些约束以及需要多长时间运行此操作。在

如果这是一个一次性(或不经常)的操作,并且内存使用不是一个大问题,那么这样做就足够了:

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)

内存使用量取决于我们需要在^{中跟踪的唯一条目的数量。如果没有太多的重复项,那么几乎所有的数据都在内存中。在

如果内存使用成为一个问题,可以分多个阶段进行:

  1. 首先通过对每行的前2个元素进行排序来预处理文件。在
  2. 把整个文件按行排序
  3. 删除重复项现在是直接进行的,因为重复项将一起出现。在

步骤2&3可以合并,因为在执行排序时比较条目时可以简单地丢弃重复项。在

如果您不介意使用shell,可以使用sort -u yourfile完成步骤2和3。在

请注意,这会更改文件中行的顺序(您提到的不是问题)。在

为了大幅减少内存使用量以牺牲某些性能为代价,可以使用基于文件的数据库来存储和查找访问过的条目(代替set())。在

您可以通过在内存中存储条目的哈希来加快速度,并且只在哈希匹配时查询数据库,以确认条目是否确实相同。散列可以很简单,比如获取每个条目的第一个字符,或者使用内置的hash()函数,或者选择一个existing hash algorithm。每种方法都是性能、哈希大小和冲突频率之间的折衷。一个好的选择取决于你的数据和你的限制。在

这需要一些努力才能找到最佳解决方案。只有当您需要经常执行此操作时才值得开始。在

相关问题 更多 >