Python:连接两个非常大(20+ GB)数据集的最有效方法?
Python : The most efficient way to join two very big (20+ GB) datasets?
我有一个 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.但是还是很耗资源的。
有没有人有任何其他更有效的想法如何去做?
按第一列对数据进行排序,例如使用 gnu 排序。
之后,您将不需要将数据存储在内存中,只需像这样使用两个迭代器即可:
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
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
我有一个 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.但是还是很耗资源的。
有没有人有任何其他更有效的想法如何去做?
按第一列对数据进行排序,例如使用 gnu 排序。 之后,您将不需要将数据存储在内存中,只需像这样使用两个迭代器即可:
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
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