2017-09-27 4 views
0

Ich schreibe eine Excel-Parser-Web-API, die eine strukturierte Datei in Objekte (eine Wiederholungsfunktion) liest.Warum String nicht entsorgt wird und wie kann ich die Speichernutzung optimieren?

Aber ich habe eine erhebliche Speicherspitze beim Parsing einige Dateien festgestellt und würde daher OutOfMemory Ausnahme werfen. Die Excel-Parser-Engine benötigt die gesamte Datei, die geladen werden soll, bevor sie ihre Struktur lesen kann. Und ich fand heraus, dass es nicht das Laden ist, das den größten Teil des Speichers verbraucht, es ist das Parsen (sich zu strukturierten Objekten verwandeln) und die json http-Rückkehr (serialisieren der Objekte zu json), die schließlich den Speicher abtötet. Zum Beispiel kann eine 1M große Datei in 70M json zerlegen.

Also googelte ich herum, fand diesen .net Memory Profiler und versuchte zu analysieren, was vor sich ging, was zu dieser enormen Speichernutzung führte. Hier ist der Schnappschuss, den ich beim gleichzeitigen Parsen der gleichen Datei aufgenommen habe. Ich habe bemerkt, dass es riesige String/Object [] gibt, die nicht GCed sind.

Jetzt bin ich verloren. Was sind die besten Praktiken, wenn Sie mit vielen Listen und vielen Strings arbeiten? Wie sollte ich die Speicherauslastung reduzieren, wo sollte ich anfangen? Was sind die Best Practices bei der Handhabung von Prozessen mit langer Laufzeit (Hinzufügen einer Warteschlange? Verwenden Sie signalR, um das Prozessergebnis zu melden?)?

Einige Anleitung würde wirklich geschätzt werden!

enter image description here

Antwort

0

Ich würde sagen, dass Sie die gesamte Datei laden auf einmal vermeiden müssen.

Hier ist ein guter Anfang:

Load Large Excel file in C#

+0

Leider ist der Excel-Parsingmaschine muss die gesamte Datei geladen werden, bevor es seine Struktur lesen kann. Tatsächlich ist es nicht das Laden, das viel Speicher verbraucht, es ist das Parsing (das sich zu strukturierten Objekten auszeichnet) und das json return (serialisieren der Objekte zu json), das schließlich den Speicher umbringt. – Spencer

+0

Ich schlage vor, Sie zeigen dann Code. Je nachdem, wie Sie die Datei analysieren und welche com-Objekte Sie verwenden, wird der Speicher gelöscht, wenn Sie sie nicht ordnungsgemäß entsorgen. Evry Arbeitsblatt, Zeile oder was auch immer Sie sonst verwenden, wird im Speicher bleiben, bis Sie es freigeben. –

Verwandte Themen