2010-12-10 31 views
4

J'essaie de compiler une liste de toutes les adresses MAC des appareils Apple. oui.txt me dit Apple a été assigné 77 plages de MAC à utiliser. Ces plages se présentent sous la forme de:Ma boucle Python for provoque une erreur MemoryError. Comment puis-je optimiser cela?

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

Cela me laisse les trois derniers chiffres HEX à ajouter. C'est 16^6. Un total de 1291845632 adresses MAC Apple.

Le problème que j'ai est d'écrire un programme pour créer une liste de ces adresses MAC. Voici mon code actuel:

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 

Cela me donne un MemoryError ... Comment puis-je optimiser?

+2

Pourquoi diable voulez-vous générer une liste complète de toutes ces adresses MAC? –

+1

Pourquoi avez-vous besoin d'énumérer plus d'un milliard d'adresses? Quel est le problème que vous essayez vraiment de résoudre? – SingleNegationElimination

+0

Eh bien, je ne veux vraiment que des MAC d'appareils iPhone, mais, d'après ce que j'ai trouvé jusqu'à présent, Apple ne semble pas avoir une gamme spécifique (s) qu'ils utilisent pour certains appareils. – dave

Répondre

18

range(1, 1291845633) crée une liste de 1 291 845 632 éléments (plusieurs Go) en même temps. Utilisez xrange(1, 1291845633) à la place et il va générer des éléments que vous en avez besoin au lieu de tous en même temps.

Quoiqu'il en soit, il semble que vous voulez faire quelque chose comme:

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

Bien sûr, il est fort probable qu'une liste de 1.3E + 9 adresses MAC ne sera pas très utile. Si vous voulez voir si une adresse MAC donnée est un périphérique Apple, vous devriez simplement vérifier si le préfixe de 3 octets est dans la liste des 77. Si vous essayez de faire le contrôle d'accès en donnant un routeur ou quelque chose d'un liste de toutes les adresses MAC possibles, il est peu probable que l'appareil acceptera 1.3e + 9 éléments dans sa liste.

+0

'xrange' ... Bien sûr! Complètement glissé mon esprit. À votre santé. – dave

1

Que diriez-vous:

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

Ne pas utiliser readlines

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

Eh bien, pour commencer, range(1, 1291845633) crée une liste contenant environ un milliard d'entrées. Étant donné que chaque entrée est au moins sizeof(Py_Object), il n'est pas surprenant que vous soyez à court de mémoire. Ne fais pas ça.

3

D'autres personnes ont répondu à question réelle, mais je ne suis pas vraiment sûr que c'est ce qui est justifié ici. Pourquoi ne pas simplement créer une classe qui implémente __contains__ pour tester algorithmiquement l'adresse MAC? Je présume que vous obtenez un MAC et que vous voulez tester si elle est peut-être un MAC iPhone, vous pouvez donc mettre en œuvre cette classe et faire quelque chose comme:

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

Alternativement, si vous voulez vraiment une séquence itératives, vous devriez au moins utiliser un générateur au lieu d'essayer réellement de les mettre tous en mémoire.