Autor Beitrag
Stephan202
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Do 04.08.11 13:06 
Hallo,

ich verwende eine Funktion, die einmal fuer sich angewendet, problemlos laeuft.
Wenn diese jedoch vielfach hintereinander aufgerufen wird, laeuft der
RAM-Speicher voll. Ich bin nicht sicher, ob es wirklich an dieser Funktion liegt,
zumindest habe ich sie aber im Verdacht.
Gibt es an dieser irgendwas (Handle, Variable), das nach Verwenden der Funktion ausser der uebergebenen Variablen im Speicher verbleibt? Grundsaetzlich nahm ich bis dato an, dass nach Funktionsgebrauch alle funktionsinternen Variablen automatisch
aus dem Speicher geloescht werden, die nicht an die aufrufende Prozedur uebergeben wurden.

Hier ist die besagte Funktion:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
    public string[,] tabelle(string pfad, string trennzeichen)
    {
      //initialisieren
      string[,] table={{"",""},{"",""}};
      
      try
      {
                  
        string[] fileContent = File.ReadAllLines(pfad);
        int linecount=fileContent.GetLength(0);
        //Spaltenzahl bestimmen
        string[] datensatz=Regex.Split(fileContent[0], trennzeichen);
        int rowcount=0;
        foreach (string wort in datensatz)
        {rowcount++;}
                    
        //table dimensionieren
        table = new string[linecount,rowcount];
          
        string zeile;
          
        for (int i = 0; i < linecount; i++) 
        {
          zeile=fileContent[i];
          datensatz=Regex.Split(zeile, trennzeichen);
            
          int j =0;
          foreach (string wort in datensatz)
          {
          table[i,j]=datensatz[j];//Print(table[i,j]); //Datenmatrix erstellen
          j=j+1;
          }
        }
      }
      catch (System.Exception excep)
        {
          MessageBox.Show(excep.Message);  
        }
        
      return table;
    }

Besten Dank schon im Vorraus fuer Eure Hilfe!

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Do 04.08.11 13:18 
Bist du dir sicher das du mit deinen ganzen Arrays nicht an die Speichergrenze kommst?

Man kann den GC auch von Hand anschmeissen
ausblenden C#-Quelltext
1:
GC.Collect();					
dark-destination1988
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 178
Erhaltene Danke: 21



BeitragVerfasst: Do 04.08.11 13:19 
ausblenden C#-Quelltext
1:
2:
foreach (string wort in datensatz) 
{rowcount++;}

ist bisl sinnlos datensatz.Length sollte das auf einen schlag lösen ;)
c#ler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 176
Erhaltene Danke: 1

Win7 64Bit
C#, VBA, VS2013 Ultimate
BeitragVerfasst: Do 04.08.11 15:40 
Vielleicht eine Allocate Memory funktion einbauen. Mit der müsstest du auch überprüfen können, ob bereits gleiche Daten im Speicher vorhanden sind und diese ggf. terminieren

Aber ist mehr vermutung als gekonnt.
Ich nutze alloc memory bei einem Datenbankgesteuerten Programm, dass auf einer mobilplattform läuft (wenig Speicher vorhanden)
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 04.08.11 20:22 
Kleiner Hinweis: Row heißt Zeile und nicht Spalte. Das war Column. Das hat mich auf den ersten Blick ziemlich verwirrt.

Du hast innerhalb der Methode zwei große Arrays: Das mit den Zeilen, und die Tabelle. Das Zeilen-Array sollte auch freigegeben werden, wenn die Methode beendet ist - aber das Tabellen-Array ist genauso groß. Wie verwendest du das denn weiter? Ich denke eher, dass das den Speicherverbrauch verursacht.
Stephan202 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Fr 05.08.11 00:27 
@bakachan:
Im "normalen Betrieb" habe ich keine Speicherplatzprobleme mit den Arrays.
Nur wenn diese innerhalb einer Prozedur zur Parameteroptierung benutzt werden,
haengt sich er Rechner auf. Irgendwas scheint sich da zu akkumulieren.
Das Tabellenarray hat ca. 7000 Zeilen und 5 Spalten.

@yogu: das Zeilenarray koennte ich tatsaechlich nach Benutzung freigeben.
Wie sieht der exakte Befehl dafuer aus?
Aber: Passiert das nicht automatisch, wenn die Funktion verlassen wird?
Das ganze wird dann so weiterverwendet, dass das Tabellenarray nach einem bestimmten Wert (Datum) in der ersten Spalte durchsucht und
der dazugehoerige Wert einer anderen Spalte ausgegeben wird. Das passiert solange immer wieder, bis das Hauptprogramm beendet ist.

@ dark-destination1988: stimmt, hab ich gar nicht dran gedacht

an alle: Stimmt es, dass Streamreader effizienter ist als die Syntax, die ich nutze und weniger Speicher frisst?