我对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
下面是我如何检索数据
^{pr2}$问题出在哪里?当我切换回带有列表的实现时,read_all中会引发异常。发电机在for循环中上升。所以问题是在循环迭代,但我不明白,生成器的问题在哪里。在
.read_all()
方法的目的正是:一次读取所有的包,并在一个列表中返回它们(技术上是一个PacketList
实例,但这对内存使用有相同的影响)。如果你的PCAP文件太大,你似乎得到一个MemoryError
,这听起来不错。在如果您不需要列表而是想要一个生成器(这确实是一个不错的选择,特别是在处理巨大的PCAP文件时),您可以直接迭代
PcapReader()
对象,无需创建自己的子类:重新定义read_all()。我认为你不应该那样做
相关问题 更多 >
编程相关推荐