2016-07-08 9 views
1

Ich habe unten Stück Code erstellt, um einige Daten in einer Access-Tabelle zu ändern:MS Access Datenbank wächst Ausgabe

Dim Ways As DAO.Recordset 
Dim Keys As DAO.Recordset 
Dim Recordcount As Double 
Dim Records As Double 
Dim ID_Old As String 
Dim ID_New As String 
Dim STArray() As String 
Dim SaveTime As String 

Set Ways = CurrentDb.OpenRecordset("Ways_Sorted") 

Recordcount = 1 
Records = 3724755 


Ways.MoveFirst 

Dim word As Variant 

    While Not Ways.EOF 
    DoCmd.SetWarnings (False) 
     DoCmd.OpenQuery "KeyFind:DEL" 
    DoCmd.SetWarnings (True) 

    Set Keys = CurrentDb.OpenRecordset("KeyFind") 

     STArray = Split(Ways!Veld4, ";") 
     For Each word In STArray 
      If Len(word) > 0 Then 
       Keys.AddNew 
       Keys!IDOld = CDbl(word) 
       Keys!IDNew = DLookup("[New ID]", "ID Keys", "[Old ID]=" & CDbl(word)) 
       Keys.Update 
      End If 
     Next 

     Keys.MoveFirst 
     While Not Keys.EOF 
     ID_Old = " " + Trim(Str$(Keys!IDOld)) 
     ID_New = " " + Trim(Str$(Keys!IDNew)) 
      Ways.Edit 
      Ways!Veld4 = Replace(Ways!Veld4, ID_Old, ID_New) 
      Keys.MoveNext 
     Wend 
     Keys.Close 

     Me.Tekst1 = Recordcount 
     Me.Tekst3 = Records - Recordcount 
     Me.Tekst5 = FileLen(Application.CurrentProject.Path & "\Map_Convert_2.mdb") 
     If FileLen(Application.CurrentProject.Path & "\Map_Convert_2.mdb") > 1977142784 Then 
       '   Exit Sub 
     End If 

     DoEvents 
     Ways!Done = True 
     Ways.Update 
     Ways.MoveNext 
     Recordcount = Recordcount + 1 
     'CommandBars("Menu Bar").Controls("Tools").Controls("Database utilities").Controls("Compact and repair database...").accDoDefaultAction 
     'Stop 
    Wend 

DoCmd.SetWarnings (False) 
    DoCmd.OpenQuery "Ways_Amend ID" 
DoCmd.SetWarnings (True) 

MsgBox "New Map created" 

Eigentlich, was der Code tut, um die Daten im Feld „Veld4“ in der Tabelle ersetzen "Ways_Sorted". Dieses Feld enthält eine Zeichenfolge mit IDs, die mit STArray = Split(Ways!Veld4, ";") in ein Array aufgeteilt ist. Dieses Array wird in einer Tabelle namens "KeysFound" gespeichert. Eine andere Tabelle in meiner Datenbank enthält die alte ID und die neue ID. Wie gesagt, der Rest des Codes wird die alte ID in "Veld4" durch die neue ID ersetzen. Es durchläuft 3,7 Millionen Datensätze auf diese Weise.

Mein Problem ist, dass nach 250 Schleifen oder so meine Datenbank mit 1mB gewachsen ist, was bedeutet, dass meine Datenbank über dem 2gB Weg ist, bevor der Code beendet ist.

Ich kann nicht erklären, warum das Wachstum geschieht und wie kann ich diese stoppen oder bei leas reduzieren das Wachstum

Antwort

0

Ihr Code viel Optimierungspotenzial hat.

Hauptproblem: Sie schreiben ständig in und löschen aus der Keys Tabelle. Ich denke, das ist auch die Ursache für das Wachstumsproblem.

Diese Tabelle ist nicht erforderlich. Tun Sie einfach den Ersatz direkt nach dem Lesen jeder Taste. Erstellen Sie die neue Veld4 als Zeichenfolge NewVeld, nur schreiben Sie es in die Tabelle, sobald Sie für die aktuelle Zeile Ways fertig sind.

STArray = Split(Ways!Veld4, ";") 
    NewVeld = "" 
    For Each word In STArray 
     If Len(word) > 0 Then 
      NewKey = DLookup("[New ID]", "ID Keys", "[Old ID]=" & CDbl(word)) 
      ' you will have to adapt this to your exact "veld" structure 
      ' If there is a specific reason, you can also continue to use Replace(), 
      ' but I don't think it's necessary. 
      NewVeld = NewVeld & ";" & NewKey 
     End If 
    Next 
    ' remove leading ";" 
    NewVeld = Mid(NewVeld, 2) 

    Ways.Edit 
    Ways!Veld4 = NewVeld 
    Ways!Done = True 
    Ways.Update 
    Ways.MoveNext 

Weitere Optimierung: DLookup ist eine ziemlich teure Operation für Ihre Zeilenanzahl.
Betrachten Sie am Anfang die gesamte ID Keys Tabelle in eine Dictionary object, dann lesen Sie die neuen IDs von dort.

+0

Thx Andre. Das hat wirklich den Trick gemacht. Ich untersuche das Dictionary-Objekt, um zu sehen, ob das auch helfen würde. – HB1963

+0

Wenn die Antwort Ihr Problem gelöst hat, können Sie [accept] (http://stackoverflow.com/help/someone-answers) es, dies markiert auch die Frage als gelöst. @ HB1963 – Andre

+0

Sie sollten in SQL Server für Ihre Arbeit suchen. Die kostenlose Version ist 10 GB und die kostenpflichtige Version hat unbegrenzten Speicherplatz. Außerdem ist es Größenordnungen schneller als MS Access !! – ryguy7272