2010-12-10 96 views
4

我想編譯一個蘋果設備將具有的所有MAC地址的列表。 oui.txt告訴我蘋果已經分配了77個MAC範圍使用。這些範圍的形式如下:我的Python for循環導致MemoryError。我怎樣才能優化這個?

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

這給我留下最後三個十六進制數字來追加。那是16^6。共有1291845632個蘋果MAC地址。

我遇到的問題是編寫一個程序來創建這些MAC地址的列表。這裏是我當前的代碼:

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 

這給了我MemoryError ...我如何優化呢?

+2

爲什麼你要生成所有這些MAC地址的完整列表? – 2010-12-10 02:20:00

+1

爲什麼你需要枚舉超過10億個地址?你真的想要解決什麼問題? – SingleNegationElimination 2010-12-10 02:21:32

回答

18

range(1, 1291845633)一次創建1,291,845,632個元素(幾個GB)的列表。改爲使用xrange(1, 1291845633),它會在您需要時生成元素,而不是一次性生成所有元素。

無論如何,它看起來像你想要更多的東西是這樣的:當然

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

它是很有可能的1.3E + 9的MAC地址列表,不會是非常有用的。如果您想查看給定的MAC地址是否是Apple設備,則應該檢查3個字節的前綴是否在77列表中。如果您嘗試通過給路由器或其他設備進行訪問控制所有可能的MAC地址列表,設備不太可能接受其列表中的1.3e + 9項。

1

如何:

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

不要使用readlines方法

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

好了,開始用,range(1, 1291845633)創建包含大約十億項的列表。由於每個條目至少爲sizeof(Py_Object),因此你的內存不足也不足爲奇。不要這樣做。

3

其他人已經回答了您的實際問題,但我不確定這是什麼保證這裏。你爲什麼不創建一個類來實現__contains__算法測試MAC地址?我相信你得到一個MAC,你想測試,如果它是可能的iPhone MAC,這樣你就可以實現這個類,然後就這樣做:

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

或者,如果你真的想要一個迭代序列,你至少應該使用一個發生器,而不是實際將它們都放在內存中。