ネットワークの膨大なリスト (A と呼ばれる) があり、これらのネットワークのアドレスが別のネットワーク リスト (B と呼ばれる) に存在するかどうかを確認する必要があります。
2 つのリストの形式は次のとおりです。
リストA
1.2.3.4
145.2.3.0/24
6.5.0.0/16
3.4.1.0/24
リスト B
1.5.6.7
10.0.3.0/24
1.2.3.0/24
3.4.0.0/16
2 つのリストの交差の期待される結果 A ∩ B: など
1.2.3.4
3.4.1.0/24
私の最初のテストは素朴でした:
この方法は小さなリストで機能します。ただし、このソリューションは、十分なメモリがないため、何千ものネットワーク (つまり、数百万の IP アドレス) には適していません。さらに、このソリューションはIPv6ネットワークには適していません。
2 つのリストを交差させる最も効果的な方法は何ですか?
追加: リスト A と他のリストの間でこれを繰り返さなければなりません。 B : A ∩ C、A ∩ D など。
豚でも、私はすべての提案を受け入れます:-)
解決 :
def chunks(l, n):
for i in xrange(0, len(l), n):
yield l[i:i+n]
res = []
for chunk_a in chunks(A, 1000):
for chunk_b in chunks(B, 1000):
C = IPSet(chunk_a) & IPSet(chunk_b)
if C > IPSet([]):
res.append(C)