2014-11-08 2 views
0

У меня есть проблема с PcapReader от scapy, которая вызывает MemoryError (без описания), когда считывается много пакетов.Ошибка памяти Scapy PcapReader

Я создал своего собственного читателя, расширив PcapReader, и я перезаписал метод scapy read_all, поэтому он возвращает generator вместо того, чтобы загружать все это в список.

class MyPcapReader(PcapReader): 

    def __init__(self, filename): 
     PcapReader.__init__(self, filename) 


    def read_all(self,count=-1): 
     """return an iterable of all packets in the pcap file 
     """ 
     while count != 0: 
      count -= 1 
      p = self.read_packet() 
      if p is None: 
       break 

      yield p 

Вот как я retrive данные

reader = MyPcapReader(fname).read_all() 

for p in reader: 

    processSingle(p) 

Где может быть проблема? Когда я возвращаюсь к реализации со списком, исключение возникает в read_all. С генератором он поднимается в цикл. Поэтому проблема заключается в итерации цикла, но я не понимаю, где проблема с генератором.

+1

Насколько велика ваша PCAP? – RyPeck

ответ

0

Вы переопределите read_all(). Я не думаю, что вы должны это делать

+0

Ну, реализация PcapReader вызывает ту же ошибку. Я не хочу переписывать его реализацию в исходном файле, и я думаю, что не должно быть проблем с наследованием класса – dakov

+0

Можете ли вы работать как wirehark правильно? – Eric

+0

Хорошо, похоже, что файл поврежден. Во всяком случае, получение «MemoryError» очень сбивает с толку. – dakov

0

Цель метода .read_all() заключается в том, что: сразу прочитайте все пакеты и верните их в список (технически, PacketList экземпляр, но это оказывает такое же влияние на использование памяти). Если ваш файл PCAP большой, вы, кажется, получаете MemoryError, что звучит хорошо для меня.

Если вы не хотите список, а скорее генератор (который действительно является хорошим выбором, особенно при работе с огромными файлами PCAP), вы можете напрямую перебирать объект PcapReader(), вам не нужно создавать свой собственный подкласс :

for p in PcapReader(fname): 
    processSingle(p) 
Смежные вопросы