2010-12-10 2 views
4

Ich versuche eine Liste aller MAC-Adressen zu erstellen, die Apple-Geräte haben werden. oui.txt sagt mir Apple hat 77 MAC-Bereiche zugewiesen zu verwenden. Diese Bereiche kommen in Form von:Meine Python for-Schleife verursacht einen MemoryError. Wie kann ich das optimieren?

00:00:00 
00:11:11 
etc... 

Dies lässt mich die letzten drei HEX Ziffern anhängen. Das ist 16^6. Insgesamt 1291845632 Apple MAC-Adressen.

Das Problem, das ich habe, schreibt ein Programm, um eine Liste dieser MAC-Adressen zu erstellen. Hier ist mein aktueller Code:

import re 

apple_mac_range = [] 
apple_macs  = [] 

# Parse the HTML of http://standards.ieee.org/cgi-bin/ouisearch to get the MACs 
with open('apple mac list', 'r') as f: 
    for line in f.readlines(): 

     match = re.search(r'[\w\d]{2}-[\w\d]{2}-[\w\d]{2}', line) 

     if match: 
      apple_mac_range.append(match.group().split('-')) 

for mac in apple_mac_range: 
    for i in range(1, 1291845633): 
     print i 

Das gibt mir ein MemoryError ... Wie kann ich es optimieren?

+2

Warum in aller Welt möchten Sie eine vollständige Liste all dieser MAC-Adressen erstellen? –

+1

Warum müssen Sie mehr als eine Milliarde Adressen aufzählen? Was ist das Problem, das Sie wirklich versuchen zu lösen? – SingleNegationElimination

+0

Nun, ich möchte wirklich nur iPhone-Geräte-MACs, aber von dem, was ich bisher gefunden habe, scheint Apple keinen bestimmten Bereich zu haben, den sie für bestimmte Geräte verwenden. – dave

Antwort

18

range(1, 1291845633) erstellt eine Liste von 1.291.845.632 Elementen (mehrere GB) auf einmal. Verwenden Sie stattdessen xrange(1, 1291845633) und es wird Elemente generieren, wie Sie sie anstelle von allen auf einmal benötigen.

Egal, es sieht aus wie Sie etwas mehr wie diese wollen:

for mac in apple_mac_range: 
    for i in xrange(16777216): 
     print mac, i 

Natürlich ist es sehr wahrscheinlich, dass eine Liste von 1.3d + 9 MAC-Adressen werden nicht sehr nützlich sein. Wenn Sie sehen wollen, ob eine bestimmte MAC-Adresse ein Apple-Gerät ist, sollten Sie nur überprüfen, ob das 3-Byte-Präfix in der Liste der 77 ist. Wenn Sie versuchen, die Zugriffskontrolle durch einen Router oder etwas zu tun Liste aller möglichen MAC-Adressen, ist es unwahrscheinlich, dass das Gerät 1.3e + 9 Elemente in seiner Liste akzeptiert.

+0

'xrange' ... Natürlich! Ich bin völlig verrückt geworden. Prost. – dave

1

Wie wäre:

i = 0 
while i < 1291845633: 
    print i 
    i += 1 
1

nicht readlines

with file('apple mac list') as f: 
    for x in f: 
     print x 
0

Nun Verwenden Sie, mit zu beginnen, range(1, 1291845633) erstellt eine Liste über eine Milliarde Einträge enthält. Da jeder Eintrag mindestens sizeof(Py_Object) ist, ist es nicht allzu überraschend, dass Sie nicht mehr genügend Speicherplatz haben. Tu das nicht.

3

Andere haben Ihre aktuelle Frage beantwortet, aber ich bin nicht wirklich sicher, das ist, was hier garantiert ist. Warum erstellen Sie nicht einfach eine Klasse, die implementiert, um die MAC-Adresse algorithmisch zu testen? Ich nehme an, Sie bekommen einen MAC und Sie wollen testen, ob es möglicherweise ein iPhone MAC, so könnten Sie diese Klasse implementieren und dann tun nur so etwas wie:

if found_mac in MACTester: 
    ...do work... 

Alternativ, wenn Sie wirklich eine iterable Sequenz wollen, Sie sollten zumindest einen Generator verwenden, anstatt zu versuchen, sie alle im Speicher zu installieren.

Verwandte Themen