Speicherprobleme beim Umgang mit großen Textmengen vermeiden

8

Ich habe ein Programm geschrieben, das den Quellcode eines Projekts analysiert und verschiedene Probleme und Metriken basierend auf dem Code meldet.

Um den Quellcode zu analysieren, lade ich die Codedateien, die in der Verzeichnisstruktur des Projekts vorhanden sind, und analysiere den Code aus dem Speicher. Der Code durchläuft eine umfangreiche Verarbeitung, bevor er an andere Methoden übergeben wird, die weiter analysiert werden sollen.

Der Code wird bei der Verarbeitung an mehrere Klassen weitergegeben.

Neulich habe ich es auf einem der größeren Projekte meiner Gruppe laufen lassen, und mein Programm ist auf mich abgefärbt, weil zu viel Quellcode in den Speicher geladen wurde. Dies ist ein Eckfall an diesem Punkt, aber ich möchte in der Lage sein, dieses Problem in der Zukunft zu behandeln.

Was wäre der beste Weg, um Speicherprobleme zu vermeiden?

Ich denke über das Laden des Codes nach, führe die anfängliche Verarbeitung der Datei durch und serialisiere dann die Ergebnisse auf der Festplatte, so dass ich, wenn ich wieder auf sie zugreifen muss, nicht den Prozess der Manipulation der Rohdaten durchlaufen muss Code erneut. Macht das Sinn? Oder ist die Serialisierung / Deserialisierung teurer als die erneute Verarbeitung des Codes?

Ich möchte bei der Bewältigung dieses Problems ein angemessenes Leistungsniveau beibehalten. Meistens passt der Quellcode ohne Probleme in den Speicher. Gibt es also eine Möglichkeit, meine Informationen nur dann zu "pagen", wenn ich zu wenig Speicher habe? Gibt es eine Möglichkeit, festzustellen, wenn in meiner Anwendung der Arbeitsspeicher knapp wird?

Aktualisieren : Das Problem ist nicht, dass eine einzelne Datei Speicher füllt, alle ihre Dateien im Speicher füllen gleichzeitig den Speicher. Meine derzeitige Idee ist es, das Diskettenlaufwerk zu drehen, wenn ich sie verarbeite

    
Dan McClain 15.09.2009, 14:08
quelle

4 Antworten

3

1,6 GB ist immer noch überschaubar und sollte nicht zu Speicherproblemen führen. Ineffiziente String-Operationen könnten dies tun.

Wenn Sie den Quellcode analysieren, teilen Sie ihn wahrscheinlich in bestimmte Teilstrings - Tokens oder wie auch immer Sie sie nennen. Wenn Ihre Token zusammen den gesamten Quellcode enthalten, verdoppelt sich der Speicherverbrauch genau dort. Je nach Komplexität der Verarbeitung kann der Multiplikator noch größer sein. Mein erster Schritt hier wäre, genauer hinzuschauen, wie Sie Ihre Strings verwenden und einen Weg finden, sie zu optimieren - dh das Original nach dem ersten Durchlauf zu verwerfen, die Leerzeichen zu komprimieren oder Indizes (Zeiger) zu den ursprünglichen Strings zu verwenden tatsächliche Teilstrings - es gibt eine Reihe von Techniken, die hier nützlich sein können.

Wenn das alles nicht helfen würde, würde ich sie auf die Festplatte hin und her schieben

    
mfeingold 15.09.2009, 15:38
quelle
1

Wenn das Problem darin besteht, dass eine einzelne Kopie Ihres Codes den verfügbaren Speicher füllt, gibt es mindestens zwei Optionen.

  • serialisieren auf Festplatte
  • Komprimiert Dateien im Speicher. Wenn Sie viel CPU haben, kann es schneller sein, Informationen im Speicher zu zippen und zu entzippen, anstatt auf Festplatte zu speichern.

Sie sollten auch prüfen, ob Sie Objekte ordnungsgemäß entsorgen. Haben Sie Speicherprobleme, weil sich alte Kopien von Objekten im Speicher befinden?

    
Shiraz Bhaiji 15.09.2009 15:12
quelle
0

Verwenden Sie WinDbg mit SOS, um zu sehen, was die Stringreferenzen (oder was auch immer die extreme Speicherauslastung verursacht) festhält.

    
leppie 15.09.2009 14:29
quelle
0

Das Serialisieren / Deserialisieren klingt wie eine gute Strategie. Ich habe eine Menge davon gemacht und es ist sehr schnell. Tatsächlich habe ich eine App, die Objekte aus einer Datenbank instanziiert und sie dann auf die Festplatten meiner Web-Knoten serialisiert. Es ist eine Weile her, seit ich es getestet habe, aber es war Serialisierung mehrere hundert eine Sekunde und vielleicht mehr als 1k zurück, als ich Lasttests war.

Natürlich hängt das von der Größe Ihrer Code-Dateien ab. Meine Dateien waren ziemlich klein.

    
Matt Wrock 15.09.2009 14:47
quelle

Tags und Links