如何解析一堆大的文本文件(每个100Gb)?

2024-09-25 08:25:06 发布

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

我有30个非常大的文本文件,其中有两列(domain | ip),其中有很多重复的记录。我最终想要的是每个ip唯一的域。以下是文件的外观:

man.bia.com|23.45.33.3
to.biaa.co.uk|23.45.33.3
man.bia.com|23.45.33.3
yahoo.com|34.55.44.2
yahoo.com|56.55.37.67

我已经尝试过类似sqlite的解决方案,但这并不合适,因为解析每个文件都要花费很多时间。 How to parse files larger than 100GB in Python?

有人对在有限的时间内用有限的内存解析这么大的数据集有什么建议吗?在


Tags: 文件toipcomdomain记录时间yahoo
2条回答

对于大文件排序可能需要很长时间,我会尝试使用dictset的纯Python解决方案:

import collections
import fileinput

results = collections.defaultdict(set)

for line in fileinput.input():
    try:
        domain, ip = line.strip().split('|')
    except ValueError:
        continue
    results[ip].add(domain)
print results # or write to file or anything

这有O(n)的复杂性,只有IO会成为这里的瓶颈。 别担心内存,除非你真的撞到了墙-这就是交换分区的用途,对吧?在

如果结果集非常大(大多数是唯一的对),并且交换需要非常长的时间,那么可以在较小的批处理上运行此脚本,将部分结果(更适合内存)写入文件存储桶(每个IP范围到单独的文件)。然后您可以使用另一个脚本分别解析这些bucket。在

如果你这么做的话

sort -t'|' -k2 -k1,1 files

后面是这个python代码

^{pr2}$

这只是浏览你的有序文件,然后写一次每个ip,然后写一个域,如果只有一个域,或者多个域,如果有重复,内存占用是最小的。在

相关问题 更多 >