VB.NET Memory Management
Update: ich habe wohl verwirrt Speicherverbrauch Probleme mit der UI-sharing selben thread wie die Verarbeitung (wie bereits von MusiGenesis unten). Jedoch in Bezug auf die Speichernutzung. Ich bin noch nicht in der Lage zu finden VB.net spezifische syntax, obwohl die Leute haben darauf hingewiesen, einige große .Net-und C# - Informationen unten (und wenn ich mehr bewandert in diesen Technologien könnte man anpassen, damit die Arbeit mit VB.net).
Erstelle ich ein VB.Net -Anwendung.
- Die Anwendung, die im Grunde Analysiert die Daten
Dateien, die auf der client-Maschine
in Datasets/DataTables. - Dann mit
DataView, bricht es die
DataTables in manageble Brocken,
schreibt in XML und sendet die XML-Daten zu einer
webservice.
Die Allgemeinen Konzepte, die funktionieren, aber ich habe Probleme, wenn die CPU-Auslastung des Task-MANAGERS wächst, wie das Programm verwendet wird, laden Sie mehr und mehr Dateien.
Beim Start, bevor etwas zu tun, die VB-Anwendung hat die 27.000 K.
Sobald die Datei analysiert wird, und auch nachdem ich entsorgen Sie das Datei-handle, sowie der Daten erhöht eine Menge. Ich ausziehen alles in den code und es scheint immer noch, dass der Speicher in der Mem-Auslastung bleibt gefangen. Es gibt keinen Reim oder Grund, warum die CPU-Auslastung wächst (d.h. manchmal kann es wachsen von 20 mb beim Lesen einer 7mb-Datei, aber andere Male, die es nicht erhöhen, wenn Lesen eine 3mb-Datei). Manchmal, es appers zum freigeben von Speicher, wenn die Analyse abgeschlossen ist, und andere Male ist es gerade hält.
Habe ich angeschaut .Net Memory Profiler und habe nicht wirklich in der Lage, Kopf oder Zahl.
Ich habe viel gelesen über das internet bezüglich der Speicher-Management auf .Net im Allgemeinen zu Entsorgen und "Nichts" und DataSets, etc, aber nicht wirklich gefunden, was in Bezug auf VB.Net speziell.
Meine Allgemeine Frage ist: gibt es irgendwelche gute tutorials/Bücher/blogs/etc, die zeigen, dass eine mehr in die Tiefe tutorial über die Verwaltung von Speicher in einer VB.Net Anwendung (d.h. wie/Wann zu veräußern/schließen, etc), oder hat jemand ein paar konkrete Tipps von da aus Erfahrung.
InformationsquelleAutor Brian | 2009-09-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, Sie brauchen, um zu realisieren, dass der Task-Manager zeigt Ihnen die Menge an Speicher das Betriebssystem reserviert hat, um Ihre Anwendung. Dies ist nicht unbedingt die Menge an Speicher tatsächlich verwendet wird. Wenn ein .NET-Anwendung zum ersten mal gestartet, das Betriebssystem reserviert Speicher für die es, genauso, wie es für jeden Prozess. Die .NET-runtime dann weiter teilt, dass der Speicher verwaltet und wie es verwendet wird. Die Laufzeit kann gedacht werden als "gierig", dass einmal allozierte Speicher durch das Betriebssystem wird es nicht geben es zurück, es sei denn ausdrücklich darum gebeten, um vom Betriebssystem. Das Ergebnis ist, dass die Speicherauslastung im Task-Manager ist nicht korrekt.
Bekommen ein wahres Bild des memory-Nutzung, müssen Sie verwenden den Systemmonitor, und fügen Sie die entsprechenden Zähler.
Soweit
IDisposable
und das dispose-Muster, werden Sie wahrscheinlich nicht viel, dass die Gespräche über dieses in der Sprache bestimmte Begriffe, da es etwas ist, bereitgestellt durch die .NET Framework selbst und ist sprachneutral. Das Muster ist das gleiche, egal, welche Sprache Sie benutzen, nur die syntax ist anders.Gibt es mehrere Verweise zur Verfügung, die Ihnen Informationen, wie memory-management arbeitet. Ich habe zwei blog-posts, die Gespräche über Über die Garbage Collection in .NET und listet die verschiedenen Ressourcen ich mit zwei Präsentationen auf einem memory-management .NET.
Die besten "Faustregel" ist, dass, wenn eine Klasse implementiert
IDisposable
spielt es also für einen Grund, und Sie sollten sicherstellen, dass Sie anrufenDispose()
wenn Sie fertig sind mit der Instanz. Dies wird am einfachsten erreicht, mit der- Anweisung.
Ohne zu wissen, mehr details, was du tust, im code ist es schwer zu helfen, einzugrenzen, wo Sie vielleicht ein Problem Auftritt. Stellen Sie sicher, dass Sie die Entsorgung des möglicherweise Einweg-Objekte, sobald Sie fertig sind mit Ihnen. Sehen Sie sich auch für Dinge wie die string-Verkettung innerhalb des loops. Sie müssen nicht angeben, welche version des .NET Framework, die Sie verwenden, aber wenn es 3.0 oder höher, möchten Sie vielleicht, zu betrachten, mit dem binary serializer zum senden der Datensätze über die Leitung an den webservice, wenn möglich.
InformationsquelleAutor Scott Dorman
Memory management in VB.Net tatsächlich behandelt der .Net Framework, so im Allgemeinen, es ist das gleiche in VB.Net wie in C#. Jedoch, zu verstehen, wie es funktioniert, können Sie besser die Programmierung Entscheidungen - wenn Sie Variablen deklarieren, Wann Objekte entsorgt werden, In diesem Kontext, ich denke, deine Frage könnte gerahmt werden wie "gibt es gute Quellen für mich zu sagen, wie, um code effizient und für einen kleineren memory-footprint", ODER "Kann mir jemand sagen warum dieses komische Sachen passieren". Beide Fragen können beantwortet werden, indem Sie ein besseres Verständnis von, wie .Net verwaltet Speicher, Rahmen, etc. Es gibt Unmengen an Ressourcen, diese zu beantworten,
Das heißt, das erste Glied hat eine Menge anderer links, die wäre nützlich für Sie:
http://geekswithblogs.net/sdorman/archive/2008/09/14/.net-memory-management-ndash-resources.aspx
Und das zweite ist mehr auf den Punkt:
http://www.c-sharpcorner.com/UploadFile/tkagarwal/MemoryManagementInNet11232005064832AM/MemoryManagementInNet.aspx
InformationsquelleAutor David
Wenn ich du wäre würde ich Erstens verwenden Sie einen profiler, um zu sehen, genau das, was die Anwendung tut. Es gibt mehrere - JetBrains, RedGate, YourKit. Von dort aus können Sie genau sehen, wo der Speicher nicht freigegeben werden.
Dann können Sie sehen, wo genau Sie brauchen, zu konzentrieren, um das Problem zu beheben
InformationsquelleAutor Rad
Dies ist nicht die Antwort auf deine Allgemeine Frage, aber Sie können senden Sie eine DataTable direkt an einen Webdienst, ohne die intermediate Schritt des zuerst schreiben Sie in XML. Tatsächlich, Sie können nicht senden Sie eine DataTable, aber Sie kann senden Sie ein DataSet (DataSet, weil serialisierbar ist, während DataTable nicht), so senden Sie eine DataTable direkt, indem Sie zuerst wickelte Sie in ein DataSet und dann senden Sie den Datensatz. Das SOAP-Protokoll wandelt die DataSet-XML sowieso, also kann man nicht wirklich gewinnen etwas durch die Umwandlung der DataTable XML selbst.
Ich vermute, aus Ihrer Frage, dass Ihr DataTables sind zu groß, um zu senden alle auf einmal, sonst bist du Sie zu brechen in kleinere Stücke, so dass die client Anwendung kann den Fortschritt anzeigt, um den Benutzer. Dies kann auch durchgeführt werden, ohne das schreiben der Inhalte in XML selbst.
Bezug auf Ihre Allgemeine Frage, ist es nicht verwunderlich, dass manchmal Ihr Gedächtnis Verbrauch wächst bis zu 20 MB beim Lesen (und senden) ein 7mb-Datei. Der XML-Code verwendet, um zu beschreiben, eine Datentabelle und deren Inhalt (ob Sie es selbst tun, oder es wird automatisch serialisiert, wenn Sie senden Sie es an einen web-service direkt) ist sehr ausführlich.
Ihre effizienteste Ansatz für dieses problem wäre zum senden der client die Daten direkt an den web-service (entweder als einzelnes byte [] - array oder als eine Reihe von byte [] - arrays), und klicken Sie dann Bearbeiten Sie diese Dateien vollständig auf dem server. Dieser Ansatz minimiert die Länge der Zeit, die erforderlich ist zum senden von einzelnen Dateien auf den server (da senden die 7mb, benötigt weniger Zeit als das senden 20mb oder sogar noch mehr).
Edit: ich wollte sagen ..."der Speicher wird nicht freigegeben" (nicht die Daten)
Edit: Oben im Grunde, was ich sage, ist, dass ich entfernen Sie einige verschiedene Datensätze aus den Dateien vor dem versenden an den server, so dass ich brauchen, um zu analysieren, unabhängig und die Größe der XML ist nicht wirklich das Problem (wie sollte dies nur eine vorübergehende Beule in Speicher). Ich will einfach nur, um herauszufinden, wie, um den Speicher freizugeben, nachdem die XML-Datei zum server gesendet, und das Programm ist nur darauf warten, um eine Analyse der nächsten Datei. Ich bin nicht erfahren genug, in Win-Apps, Bild/Spur, wo diese Erinnerung gespeichert wird.
zur Klärung Ihrer Frage, sind Sie eigentlich erleben Mangel an Speicher-Probleme, oder sind Sie nur besorgt über das, weil von dem, was Sie sehen, in Mem-Nutzung? Sie können rufen Sie Dispose auf den Datenbestand, aber ich bin nicht sicher, es ist sogar notwendig, wenn du bist so dass das DataSet zu gehen, out of scope, nachdem Sie fertig sind mit ihm. Auch, Sie nennen könnte "GC.Collect();" - dies kann zu einem unmittelbaren Rückgang der Mem-Nutzung. Im Allgemeinen jedoch, ich würde nicht kümmern, wenn Sie beginnen, führen Sie in offensichtliche, nachweisbare Probleme.
sorry für den Vortrag in meiner Antwort - die Gründe für Sie, Dinge zu tun client-Seite sind vollkommen gültig. Allerdings würde ich Sie nur schicken Sie das DataSet direkt auf die web-service-anstatt zuerst schreiben in eine XML-Datei, es sei denn, Sie haben bereits umfangreiche code in der web service, der erwartet, dass XML.
InformationsquelleAutor MusiGenesis
Das beste Buch, um auf das Thema, dass ich gelesen habe, ist Jeff Richter 's Buch" CLR via C#:
http://www.amazon.com/CLR-via-Second-Pro-Developer/dp/0735621632/ref=sr_1_1?ie=UTF8&qid=1252853101&sr=8-1-spell
Wenn Sie möchten, eine VB.NET die version, die Sie haben, dass für die erste Auflage des Buches, aber ich glaube nicht, dass es genug Interesse an der übersetzung des Buches in VB.NET für die zweite version. Wenn Sie wollen, um wirklich zu lernen .NETZ, sollten Sie Holen Sie sich bequem mit C#. In beiden Sprachen wird, ist der Speicher von der CLR verwaltet wird.
InformationsquelleAutor Dave Markle