tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
1666
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von spirit
    spirit spirit ist offline Mitglied Brokat
    Registriert seit
    Jan 2004
    Ort
    Duisburg (NRW)
    Beiträge
    308
    Hallöchen

    Ich habe da mal wieder ein kleines Problem...

    Ich habe einen Ordner in dem in Unterverzeichnissen ca. 100.000 nach einem Chema gespeichert, bei dem ich mit einem Schlagwort die Bilder zum entsprechenden Thema finde. Damit es nicht immer eine Ewigkeit dauert habe ich mir eine MySql Datenbank erstellt, in der mit einer Schleife und dem Filesystemobject die Ordner rekursiv durchsucht und eingetragen werden. Das funktioniert prächtig.

    Leider hat diese Schleife aber den NAchteil, das der Arbeitsspeicher bei jedem Durchlauf kontunuierlich voll läuft. Das waren zuletzt fast 1,9 GB !

    Daher meine Frage: Gibt es einen Befehl der den Arbeitsspeicher "entlastet" ?

    So als Idee...Führe Schleife aus und gebe die Ressourcen wieder frei

    Im voraus vielen Dank!!
     
    Schweigen ist auch eine Art um mangelndes Wissen zu verbergen

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Zeig doch mal ein wenig Code, damit wir einen Ansatz haben mit welchen VB-Methoden du da arbeitest
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  3. #3
    Avatar von spirit
    spirit spirit ist offline Mitglied Brokat
    Registriert seit
    Jan 2004
    Ort
    Duisburg (NRW)
    Beiträge
    308
    Bitte schön..)

    Code :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    
    Private Sub eintragMP3(ByVal song As String)
            
        '// Verbinung herstellen
        oConn.OpenConnection HOST, USER, PASS, DB
        
        '// Songtitel in Statusbar angeben
        StatusBar1.Panels(1).Text = "Trage ein: " & song
       
        '// Einfache Slash gegen doppelte Slash tauschen
        strDBfile = Replace(song, "\", "\\")
           
        '// Datenbank störende Zeichen ersetzen
        strDBfile = Replace(strDBfile, "'", "")
        strDBfile = Replace(strDBfile, "´", "")
        strDBfile = Replace(strDBfile, "`", "")
            
        '// Titel und Pfad zerlegen
        ssong = Split(strDBfile, "\\")
        nameSong = ssong(UBound(ssong))
        nameSong = Replace(nameSong, ".mp3", "")
        
        '// Prüfen ob DAtei schon in Datenbank vorhanden
        Set oRs = oConn.Execute("select * from " & TABLE & " where name = '" & nameSong & "' and pfad = '" & strDBfile & "'")
        
        '// Anzahl prüfen
        If oRs.RecordCount > 0 Then GoTo errHnd
        
        '// Titel in Datenbank eintragen
        oConn.Execute ("insert into " & TABLE & " (name, pfad, chksumm, playcount) values ('" & nameSong & "','" & strDBfile & "','#',0) ")
        DoEvents
        
        
        '// Fehler abfangen
        If oConn.Error.Number = 0 Then
            
            '// Anzahl der in der Datenbank gesoeicherten Songs
            Set oRs = oConn.Execute("select * from " & TABLE & "")
            
            '// Anzahl ausgeben
            lblSave.Caption = oRs.RecordCount
            
        Else
        
            '// Anzahl Erro Dateien ausgeben
            lblError.Caption = lblError.Caption + 1
            
        End If
        
    errHnd:
     
        '// Recordset freigeben
        Set oRs = Nothing
     
        '// Datenbankverbindung schliessen
        oConn.CloseConnection
        
    End Sub

    Hier wird einfach ein Pfad übergeben der eingetragen werden soll.
     
    Schweigen ist auch eine Art um mangelndes Wissen zu verbergen

  4. #4
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Arbeitest du mit ADO, DAO, ODBC oder mit was?

    item: Den Recordset solltest du schliessen bevor du in mit Nothing oder einem neuen Inhalt überschreibst (Call oRs.close)
    item. Wozu den oRs.FillCache ? Den brauchst du da mMn nicht. Frisst auch nur speicher.
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  5. #5
    Avatar von spirit
    spirit spirit ist offline Mitglied Brokat
    Registriert seit
    Jan 2004
    Ort
    Duisburg (NRW)
    Beiträge
    308
    Danke für deine Antwort.

    Ich arbeite mit einer dll mit der es möglich ist MySql DAtenbanken direkt anzusprechen.
    Habe die Recodset explicit geschlossen. Bingt aber auch nichts. Wie kommst du auf

    oRs.FillCache ?
    Nach jedem Eintrag in die Datenbank sind ca 100kB Speicher mehr belegt.
    Geändert von spirit (14.12.09 um 14:15 Uhr)
     
    Schweigen ist auch eine Art um mangelndes Wissen zu verbergen

  6. #6
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Zitat Zitat von spirit Beitrag anzeigen
    Bingt aber auch nichts. Wie kommst du auf
    oRs.FillCache ?
    Ups, mein Fehler. Ist da reingerutscht als ich im VBA die methoden von DAO.Recordset durchsuchte und nachher hab ich nicht mehr gemerkt das es von mir ist (telefonische Ablenkung).

    Es gibt noch 2 Orte wo ich etwas vorstellen kann.
    1) das dll gibt den Speicher nicht frei -> Doku zum dll sollte auskunft geben wie man den Speicher frei gibt.
    2) du löst die Liste nicht sauber auf, wo die Files durchgeackert werden. Der Speicherverbrauch ist dann nicht auf Seite MySQL/dll sonder im Code von dir. Dies kann ich aber anhand des geposteten Codes nicht beurteilen
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  7. #7
    Avatar von spirit
    spirit spirit ist offline Mitglied Brokat
    Registriert seit
    Jan 2004
    Ort
    Duisburg (NRW)
    Beiträge
    308
    mehr Code gibt es da nicht...der geposteten Prozedur wird lediglich ein pfad aus einem FileSystemObjekt übergeben.....
     
    Schweigen ist auch eine Art um mangelndes Wissen zu verbergen

  8. #8
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Zitat Zitat von spirit Beitrag anzeigen
    mehr Code gibt es da nicht...der geposteten Prozedur wird lediglich ein pfad aus einem FileSystemObjekt übergeben.....
    Nicht nur ein Pfad, sondern ein Pfad nach dem anderen. Räumst du dort jeweils sauber auf? Arbeitest du mit einer Collection?
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  9. #9
    Avatar von spirit
    spirit spirit ist offline Mitglied Brokat
    Registriert seit
    Jan 2004
    Ort
    Duisburg (NRW)
    Beiträge
    308
    Aus einer Dirbox übergebe ich per Klick den Pfad:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    Private Sub cmdSuche_Click()
        
        '// Objektzuweisung
        Set objFSO = New Scripting.FileSystemObject
     
        '// Dateien suchen
        FindFiles Dir1.Path, "*.mp3"
        
        '// Variable initialisieren
        lngCount = 0
            
    End Sub

    mit dem Aufruf wird der Startpfad übergeben:

    Code :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    
    Private Sub FindFiles(ByVal vsFolderPath As String, ByVal vsSearch As String)
     
        '// Verweis auf den zu durchsuchenden Ordner setzen:
        Set objFolder = objFSO.GetFolder(vsFolderPath)
      
        '// Alle Dateien mit allen Attributen suchen
        strFileName = Dir$(objFSO.BuildPath(objFolder.Path, vsSearch), _
                      vbNormal Or vbHidden Or vbSystem Or vbReadOnly)
                      
        '// So lange Dateien im Ordner vorhanden sind...
        Do While Len(strFileName) > 0
          
            '// Zaehler erhöhen
            lngCount = lngCount + 1
          
            '// Anzahl ausgeben
            Label5.Caption = lngCount
          
            '// Dateinamen übergeben
            strFile = objFSO.BuildPath(objFolder.Path, strFileName)
                  
            '// Statusbar rot markieren
            Shape1.BackColor = &HFF&
            DoEvents
          
            '// Datei in Datenbank eintragen
            eintragMP3 strFile
            
            '// Warteschleife für 1 Sekunde
            'Sleep (20)
          
            '// Statusbar wieder grün markieren
            Shape1.BackColor = &HFF00&
            DoEvents
          
            '// Zähler für Dateien erhöhen
            lngFileCount = lngFileCount + 1
          
            '// Nächste Datei suchen
            strFileName = Dir$()
          
        Loop
        
        '//Wenn Unterordner vorhanden sind...
        If objFolder.SubFolders.Count > 0 Then
        
            '// Alle Unterordner durchsuchen...
            For Each objFolderLoop In objFolder.SubFolders
              
                '//Funktion erneut aufrufen
                FindFiles objFolderLoop.Path, vsSearch
                                        
            '// nächstes Objekt
            Next objFolderLoop
            
            If objFolderLoop Is Nothing Then GoTo errHnd
               
        End If
        
     
        Exit Sub
       
    errHnd:
      
        '// Verbinung herstellen
        oConn.OpenConnection HOST, USER, PASS, DB
        
        '// Anzahl Datenbankeinträge auslesen
        Set oRs = oConn.Execute("select name from " & TABLE & "")
        
        '// Anzahl ausgeben
        lblSave.Caption = oRs.RecordCount
        
        '// Recordset schliessen
        oRs.CloseRecordset
        
        '// Recordset freigeben
        Set oRs = Nothing
        
        '// Dartenbankberbindung trennen
        oConn.CloseConnection
        
        '// Meldung ausgeben
        MsgBox "Fertig...", vbOKOnly + vbInformation, App.Title
        
        
    End Sub

    Ohne den Eintrag:

    Code :
    1
    
    eintragMP3 strFile

    bleibt der Speicher konstant. Also muss es etwas mit der Mysql DB zu tun zu haben
     
    Schweigen ist auch eine Art um mangelndes Wissen zu verbergen

  10. #10
    tintin Tutorials.de Gastzugang
    Hallo spirit,

    hast Du eigentlich eine Antwort auf Dein Problem:
    >>>>>Nach jedem Eintrag in die Datenbank sind ca 100kB Speicher mehr belegt.
    bekommen?

    Ich habe nämlich genau das gleiche und weiss nicht weiter.
    Gruß tintin
     

Ähnliche Themen

  1. Speicher freigeben
    Von Jennesta im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 06.07.10, 23:14
  2. Applet und JVM Speicher wieder freigeben
    Von eusti im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 27.06.06, 19:40
  3. Antworten: 6
    Letzter Beitrag: 07.02.05, 18:49
  4. Antworten: 3
    Letzter Beitrag: 01.11.03, 11:19
  5. [C++] calloc, speicher wieder freigeben
    Von Crayzee Ivan im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 12.08.02, 10:00