2013-07-18 2 views
0

Здравствуйте, у меня есть небольшой скрипт на питоне, его задача - считывать данные из TXT-файла и сортировать его в конкретном удаляемом дубликате и удалять бессмысленные данные и переносить их обратно в другой TXT файл этот формат MAC IP номер устройстваОбработка огромного количества данных на маленьком скрипте python

import re 
f = open('frame.txt', 'r') 
d = open('Result1.txt', 'w') 
mac="" 
ip="" 
phoneName="" 
phoneTel="" 
lmac="" 
lip="" 
lphoneName="" 
lphoneTel="" 
lines=f.readlines() 
s=0 
p=0 
for line in lines: 
    matchObj = re.search('(?<=Src:)[0-9a-z]{2}:[0-9a-z]{2}:[0-9a-z]{2}:[0-9a-z]{2}:[0-9a-z]{2}:[0-9a-z]{2}', line, re.M|re.I) 
    if(matchObj): 
      mac=matchObj.group(0)+"\t" 
    matchObj = re.search('(?<=Src:)([0-9]+)(?:\.[0-9]+){3}', line, re.M|re.I) 
    if(matchObj): 
      ip=matchObj.group(0)+"\t" 
    if(s==1): 
     s=0 
     matchObj = re.search('(?<=Value:)\d+',line,re.M|re.I) 
     if(matchObj): 
      phoneName=matchObj.group(0)+"\t" 
    if(p==1): 
     p=0 
     matchObj = re.search('(?<=Value:).+',line,re.M|re.I) 
     if(matchObj): 
      phoneTel=matchObj.group(0)+"\t" 
    matchObj = re.search('(?<=Key: user \(218)', line, re.M|re.I) 
    if(matchObj): 
     s=1 
    matchObj = re.search('(?<=Key: resource \(165)', line, re.M|re.I) 
    if(matchObj): 
     p=1 
    if(mac!="" and ip!="" and phoneName!="" and phoneTel!="" and mac!=lmac and ip!=lip and phoneName!=lphoneName and phoneTel!=lphoneTel):   
     d.write(mac+" " +ip+" "+ phoneName+" "+ phoneTel) 
     lmac=mac 
     lip=ip 
     lphoneName=phoneName 
     lphoneTel=phoneTel 
     d.write("\n") 
    matchObj = re.search('Frame \d+', line, re.M|re.I) 
    if(matchObj):    
     mac="" 
     ip="" 
     phoneName="" 
     phoneTel=""   
d.close() 
f.close() 

здесь код проблема заключается в том, что код нужно обрабатывать огромное количество данных, которые могут достигать 100 Гбайт, и когда я делаю, чтобы программа замерзает и убить себя любую идею как чтобы решить эту проблему, спасибо вам большое!

+0

Звучит как работа для 'awk'. Как выглядит ваш файл? – Blender

ответ

5

Вы читаете весь файл в начале - если файл такой большой, загрузка его в память будет проблемой. Вместо этого попробуйте выполнить итерацию поверх строк. Как правило, вы хотите

with open(filename) as f: 
    for line in f: 
     # This will iterate over the lines in the file rather than read them all at once 

Так что для вас, изменить конструкцию петли на:

for line in f: 

и удаления:

lines=f.readlines() 
+0

спасибо, что это сработало :) –

1

использовать Readline() вместо readlines()

readlines() считывает весь файл в память сразу.

Смежные вопросы