gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:51:46 24 4
gpt4 key购买 nike

我有一个包含约 2000 万行(约 1.5GB)的文件。每行的形式为:

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

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

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

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

有没有人对如何从这种大小的文件中删除这种性质的重复项有任何建议?

谢谢。

最佳答案

合适的解决方案取决于您有哪些限制以及您需要多久运行一次此操作。

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

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)

内存使用量取决于我们需要在visited 中跟踪的unique 条目的数量。如果重复项不多,您最终会得到内存中几乎所有的数据。

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

  1. 首先通过对每行中的前 2 个元素进行排序来预处理文件。
  2. 按行对整个文件进行排序
  3. 删除重复项现在非常简单,因为重复的条目会一起出现。

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

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

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

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

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

这将需要一些努力才能找到最佳解决方案。仅当您需要经常执行此操作时才值得着手。

关于Python - 过滤/排序大文件的建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6999641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com