Scapy PcapReader内存错误

时间:2014-11-08 08:55:12

标签: python python-2.7 memory pcap scapy

我遇到了scapy的PcapReader问题,当读取很多数据包时会导致MemoryError(没有描述)。

我通过扩展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

以下是我如何检索数据

reader = MyPcapReader(fname).read_all()

for p in reader:

    processSingle(p)

哪里可以出问题?当我切换回带有列表的实现时,会在read_all中引发异常。使用发电机,它会进入循环。问题在于循环迭代,但我不明白,生成器的问题在哪里。

2 个答案:

答案 0 :(得分:0)

您重新定义read_all()。我不认为你应该这样做

答案 1 :(得分:0)

.read_all()方法的目的正是:一次读取所有数据包并将它们返回到列表中(技术上,PacketList实例,但这对内存使用具有相同的影响) 。如果您的PCAP文件太大,您似乎得到MemoryError,这对我来说听起来不错。

如果你不想要一个列表而是一个生成器(这确实是一个很好的选择,特别是在处理大型PCAP文件时),你可以直接迭代PcapReader()对象,不需要创建你自己的子类:

for p in PcapReader(fname):
    processSingle(p)