2016-05-17 8 views
-1

Ich möchte alle verwendeten Ports in großen Pcaps aufzeichnen. Es sind 65535 Ports verfügbar und jeder Port kann jeden Port miteinander kommunizieren: 65535 x 65535 Links insgesamtBig Graph im Speicher

Die Matrix wird sehr spärlich sein (viele 0 Einträge). Außerdem denke ich, dass die Kanten nicht gerichtet werden müssen, daher kann Port1-> Port2 zu Port2-> Port1 hinzugefügt werden (was unsere Anzahl der Werte auf 65535 * 65536/2 reduziert). Wie würden Sie dies mit Python speichern? In numpiger? Wie hoch ist der geschätzte Speicherbedarf?

Danach möchte ich die größte Summe für einen Port finden und pop() es (die ganze Zeile und Spalte während). Das heißt, ich möchte z.B. Port1 wurde 500 Mal verwendet (100 Mal von Port2 nach Port1, 300 Mal von Port3 nach Port1, Port4 nach Port1 100 Mal) ...

Grafisch gesprochen möchte ich 65535 Knoten haben, die miteinander verbunden werden können. Dann möchte ich den Knoten finden, der an verbundenen Kanten die höchste Summe von Werten hat. Danach möchte ich den Knoten knacken (und die entsprechenden Kanten löschen, was die Summe der anderen Knoten verringert).

Danke!

+0

Sie wollen, Sie wollen, Sie wollen ... Niemand kümmert sich, was ich will! : P - Es ist ein wenig Aufwand (aka Codes) erforderlich, um eine Antwort – gunzapper

Antwort

1

In Python, und je nachdem, wie spärlich spärlich ist, wird ein dict-of-dicts recht gut damit umgehen.

connections = { ..., 8080: { 4545:17, 20151:3, ...}, ...} 

Wenn ich verstanden habe, was Sie richtig machen, dann ist die Anzahl der Verbindungen zu Port p

count = sum(connections[8080].values()) 

Entfernen Port p

del connections[p] 
for conn in connections.values(): # edit, bug fixed. 
    if p in conn: 
     del conn[p] 

Wenn Sie versuchen wollen Speicher sparen, indem nur die Hälfte der Paare gespeichert wird, dann leidet die Einfachheit stark.

+0

Das ist gut. Vielen Dank!Man könnte auch ein neues Array erstellen und alle "gelöschten" Ports speichern, so dass selbst wenn neue Pakete ankommen, man die alte Liste für weitere Analysen verwenden kann. – mutilis

+0

Eine andere Möglichkeit könnte eine Liste von Mengen sein, um Präsenz in oder Abwesenheit von den spärlichen Daten zu bestimmen, und ein durch ein ganzzahliges 2-Tupel indiziertes Diktat zum Speichern der spärlichen Daten (die niemals gelöscht werden müssen, könnte kontinuierlich aktualisiert werden) map '(m, n) 'bis' (n, m) 'if' n> m ', um eine redundante Speicherung von nicht gerichteten Kanten zu vermeiden. – nigel222

0

Schauen Sie in die Adjazenzliste-Darstellung von Graph, es wird höchstwahrscheinlich Ihren Bedürfnissen entsprechen.

Allerdings ist ein Graph mit 65535 Vertices nicht so groß. Auch wenn Sie es nicht mit einer einfachen Matrix darstellen können.

Der Speicherverbrauch ist O (E + V) mit V Anzahl der Scheitelpunkte (65535) und E Anzahl der Kanten (auf einem dünnen Graphen hat es die gleiche Größenordnung als V).

+0

65536 Knoten => 65535 * 65535 Kanten möglich, was 4294967296 Kanten (oder Einträge in einer Matrix) entspricht. wenn jeder Eintrag 4 Bytes verbraucht, z.B. das wäre 16GB – mutilis

+1

Wenn es spärlich ist (einige Kanten nach Vertex), ist es nicht. –

+0

für die meisten Scheitelpunkte wird es spärlich sein, für Ports, die für bestimmte Protokolle verwendet werden (wie 6000 für x11), wird es nicht spärlich sein ... – mutilis