Python:加入两个非常大(20+ GB)数据集的最有效方法?

时间:2015-06-08 16:05:17

标签: python join dictionary lookup

我有一个21 GB的数据集df_ns:

domain|ns
123.com|ns1.domanihost.com
hymi.net|ns2.hostinger.com

和另一个12 GB数据集df_ip:

ip|domain
28.76.2.2|myname.com
86.90.234.5| 123.com

我想加入他们的域名,以及两个文件中的域提取ip和ns。

我想用它的方法是将df_ip数据加载到字典中并逐行浏览df_ns数据并检查域是否存在,然后提取ns。但它仍然非常耗费资源。

是否有人有任何其他更有效的想法如何做到这一点?

2 个答案:

答案 0 :(得分:2)

按第一列对数据进行排序,例如使用gnu sort。 之后,您不需要将数据存储在内存中,只需使用两个迭代器,如下所示:

import csv, sys
it1 = (csv.reader(open("df_ns", "r")))
it2 = (csv.reader(open("df_ip", "r")))
# skip the headers
it1.next()
it2.next()
try:
    dm1, ns = it1.next() # first row
except StopIteration:
    sys.exit(0)
try:
    dm2, ip = it2.next()
except StopIteration:
    sys.exit(0)
while True:
    if dm1 == dm2:
        print dm1, ns, ip
    if dm1 < dm2:
        try:
            dm1, ns = it1.next()
        except StopIteration:
            break
        continue
    try: 
        dm2, ip = it2.next()
    except StopIteration:
        break

答案 1 :(得分:1)

sort -o df_ns.csv df_ns.csv && \
sort -o df_ip.csv df_ip.csv && \
join -t'|' df_ns.csv df_ip.csv > df_combined.csv

参考:http://linux.die.net/man/1/join