Speicherfehler nach 65.527 Zugriffen auf Clipboard
22.02.2017 20:13:20
Zwenn
zur Abwechslung habe ich mal ein Problem, bei dem ich nicht weiter komme.
Ich habe ein Makro geschrieben, um Hashwerte zu Dateien zu berechnen und zusammen mit ein paar anderen Bezugswerten in eine Tabelle zu schreiben. Das Ganze wird anschließend in eine Datenbank importiert. Insgesamt handelt es sich bei mir um 3 Mio. Bilder, die gehasht werden müssen, die zu 1,5 Mio. Datensätzen gehören. Die Datensätze sind auf 11 Tabellen aufgeteilt, von März 2016 bis Januar 2017 sind alle Datensätze für einen Monat jeweils in einer Tabelle, in einer eignen Arbeitsmappe gespeichert.
Die Berechnung des Hashwertes erfolgt über das Konsoplenprogramm ReHash
Download: http://rehash.sourceforge.net/
Anleitung: http://rehash.sourceforge.net/rehash.html
Ich rufe ReHash auf der Konsole (cmd) über den Windows Scripting Host auf. Das mache ich, weil man dem Aufruf über den WSH einen Parameter mitgeben kann, damit das Makro wartet, bis der Aufruf beendet wurde. So spare ich mir das Brimborium die Process ID überwachen zu müssen.
Die Ausgabe von ReHash leite ich mit | Clip an die Windows Zwischenablage um. Auf die Zwischenablage greife ich dann mit der Funktion von Peter Haserodt aus dem Jahr 2004 zu:
Public Function HoleTextVonZwischenablage() As String
' Benötigt einen Verweis auf die Microsoft Forms 2.0 Objektlibrary
' (Sollten Sie diese nicht so einfach finden, einfach eine Userform
' einfügen und dann wieder entfernen)
' Peter Haserodt 2004
'Quelle: http://www.online- _
excel.de/excel/singsel_vba.php?f=28
Dim oData As New DataObject
'Fehlerbehandlung für meinen Anwendungsfall nicht notwendig
'On Error Resume Next ' Brutal um falsche Formate abzuwürgen, gibt dann einen Leerstring
oData.GetFromClipboard
HoleTextVonZwischenablage = oData.GetText
'Test, weil nach 65.527 Zugriffen auf diese Funktion ein Speicherfehler kommt, die sich _
immer auf den Zugriff auf das Clipboard bezieht
Set oData = Nothing
End Function
Der Plan ist natürlich alle Bilder, die zu einer Arbeitsmappe gehören, in einem Rutsch zu hashen. Aber nach exakt 65.527 berechneten Bildern, bricht das Makro mit folgender Fehlermeldung ab:Es passiert immer bei dieser Anzahl, ich habe bereits 5 Monatstabellen so durchgerechnet. Nur muss ich immer manuell eingreifen und Excel nach der Fehlermeldung neu starten. Bis zu dem Fehler vergehen ziemlich genau 3 Stunden, die das Makro klaglos seinen Dienst verrichtet. (Die Zeit kommt zusammen, weil die Bilder noch auf der Platte verschoben werden und zusätzlich noch Tests auf das Vorhandensein von PDF Dateien, mit anschließender Verschiebung auf der Platte bei erfolgreicher Prüfung, durchgeführt werden.)
Ich dachte zunächst, es handelt sich um ein Problem mit dem Konstrukt, cmd innerhalb des WSH aufzurufen und das ganze noch an clip.exe zu koppeln. Deshalb habe ich nach je 1.000 Schleifendurchläufen auf alle externen Programme, die das Makro verwendet, taskkill angewendet. Das brachte aber gar nix. Dann habe ich das DataObject in der Funktion oben mit set nothing bei jedem Aufruf zusätzlich zurückgesetzt. Auch das hat nix gebracht.
Der Arbeitsspeicher ist übrigens nicht mal ansatzweise voll. Zwar verwende ich Excel nur in der 32 Bit Version, aber die 65.527 sehen ja sehr nach einem 16 Bit Adressraum aus. Das kann natürlich auch Zufall sein, weil es ja nicht genau 65.536 sind.
Ich habe im Internet nix zu diesem Problem gefunden. Hat jemand von Euch eine Idee? Vielleicht durch einen anderen Zugriff auf die Ausgabe von ReHash. Vielleicht kann auch jemand etwas zu dem Speicherfehler selbst sagen, bzw. woher er kommt.
Viele Grüße,
Zwenn