我遇到了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中引发异常。使用发电机,它会进入循环。问题在于循环迭代,但我不明白,生成器的问题在哪里。
答案 0 :(得分:0)
您重新定义read_all()。我不认为你应该这样做
答案 1 :(得分:0)
.read_all()
方法的目的正是:一次读取所有数据包并将它们返回到列表中(技术上,PacketList
实例,但这对内存使用具有相同的影响) 。如果您的PCAP文件太大,您似乎得到MemoryError
,这对我来说听起来不错。
如果你不想要一个列表而是一个生成器(这确实是一个很好的选择,特别是在处理大型PCAP文件时),你可以直接迭代PcapReader()
对象,不需要创建你自己的子类:
for p in PcapReader(fname):
processSingle(p)