Я написал сценарии, которые регистрируют MAC-адреса из pcapy в mysql через SQLAlchemy, изначально я использовал прямой sqlite3, но вскоре понял, что требуется что-то лучшее, поэтому в эти выходные, когда я переписал всю базу данных, выполнить SQLAlchemy. Все работает нормально, данные поступают и снова появляются. Я, хотя sessionmaker() был бы очень полезен для управления всеми сеансами в БД для меня.Использование памяти Strange Python с помощью Scapy
Я вижу странное явление в отношении потребления памяти. Я запускаю скрипт ... он собирает и записывает все в DB ... но на каждые 2-4 секунды у меня есть мегабайт в размере увеличения потребления памяти. На данный момент я говорю о очень немногих рекордах, под-100 рядах.
Последовательность сценария:
- сценария Запуск
- SQLAlchemy читает mac_addr колонку в maclist [].
- scapy получает пакет> если new_mac находится в maclist []?
если true? только пишите метку времени в столбец времени, где mac = newmac. вернуться к этапу 2.
если false?, тогда напишите новый mac на DB. очистить maclist [] и снова вызвать шаг 2.
После 1h30m у меня есть память размером 1027MB (RES) и 1198MB (VIRT) с 124 строками в базе данных 1 таблицы (MySQL).
В: Может ли это быть внесено в список maclist [], очищаемый и повторно заполненный из БД каждый раз?
В: Что произойдет, когда оно достигнет максимальной памяти системы?
Любые идеи или советы были бы очень благодарны.
вывод memory_profiler для рассматриваемого сегмента, где список [] заполняется из столбца базы данных mac_addr.
Line # Mem usage Increment Line Contents
================================================
123 1025.434 MiB 0.000 MiB @profile
124 def sniffmgmt(p):
125 global __mac_reel
126 global _blacklist
127 1025.434 MiB 0.000 MiB stamgmtstypes = (0, 2, 4)
128 1025.434 MiB 0.000 MiB tmplist = []
129 1025.434 MiB 0.000 MiB matching = []
130 1025.434 MiB 0.000 MiB observedclients = []
131 1025.434 MiB 0.000 MiB tmplist = populate_observed_list()
132 1025.477 MiB 0.043 MiB for i in tmplist:
133 1025.477 MiB 0.000 MiB observedclients.append(i[0])
134 1025.477 MiB 0.000 MiB _mac_address = str(p.addr2)
135 1025.477 MiB 0.000 MiB if p.haslayer(Dot11):
136 1025.477 MiB 0.000 MiB if p.type == 0 and p.subtype in stamgmtstypes:
137 1024.309 MiB -1.168 MiB _timestamp = atimer()
138 1024.309 MiB 0.000 MiB if p.info == "":
139 1021.520 MiB -2.789 MiB _SSID = "hidden"
140 else:
141 1024.309 MiB 2.789 MiB _SSID = p.info
142
143 1024.309 MiB 0.000 MiB if p.addr2 not in observedclients:
144 1018.184 MiB -6.125 MiB db_add(_mac_address, _timestamp, _SSID)
145 1018.184 MiB 0.000 MiB greetings()
146 else:
147 1024.309 MiB 6.125 MiB add_time(_mac_address, _timestamp)
148 1024.309 MiB 0.000 MiB observedclients = [] #clear the list
149 1024.309 MiB 0.000 MiB observedclients = populate_observed_list() #repopulate the list
150 1024.309 MiB 0.000 MiB greetings()
Вы увидите, что наблюдаемые клиенты - это список.
Очень трудно сказать что-либо без кода, если предположить, что это не утечка в SQLAlchemy или scapy а не в вашем коде (кажется маловероятным). Кажется, у вас есть представление о том, где может произойти утечка, выполните некоторые [профилирование памяти] (http://stackoverflow.com/questions/110259/which-python-memory-profiler-is-recommended), чтобы убедиться, что вы были правы , Как только ваш процесс python будет потреблять достаточное количество памяти, вы, вероятно, получите исключение «MemoryError». –