Directory() Verzeichnis mit 1,3 Mio Dateien

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

DerRolf
UDF-Programmierer
UDF-Programmierer
Beiträge: 76
Registriert: Mi, 10. Sep 2014 9:53
Hat sich bedankt: 3 Mal

Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von DerRolf »

Guten Morgen liebe Forengemeinde.
Ich muss ein Verzeichnis mit 1,3 Millionen Dateien einlesen.
Das klappt leider nicht.

Bekomme folgende Fehlermeldung:
FATAL ERROR LOG
Error within the error handling!
SYS Thread-ID: 1028
Module: EXE
Error Codes: EH: 1006 Sub: 0(0) OS: 0 XPP: 15
Call Stack of Thread 1 (1028):
RECHNUNGSCHECK(76)
(B)Main(41)
@XBPPUSHBUTTON@I@HANDLEEVENT(1556)
MAIN(53)
Call Stack of GUI Thread (1200):
File: d:\sani\Rechnungscheck 2020\fuelldatei.exe
TimeStamp: 20200115 10:29
End of FATAL ERROR LOG.
FATAL ERROR LOG
Error within the error handling!
SYS Thread-ID: 1028
Module: EXE
Error Codes: EH: 1006 Sub: 0(0) OS: 0 XPP: 15
Call Stack of Thread 1 (1028):
RECHNUNGSCHECK(76)
(B)Main(41)
@XBPPUSHBUTTON@I@HANDLEEVENT(1556)
MAIN(53)
Call Stack of GUI Thread (1200):
File: d:\sani\Rechnungscheck 2020\fuelldatei.exe
TimeStamp: 20200115 10:31
End of FATAL ERROR LOG.
FATAL ERROR LOG
Error within the error handling!
SYS Thread-ID: 1028
Module: EXE
Error Codes: EH: 1006 Sub: 0(0) OS: 0 XPP: 15
Call Stack of Thread 1 (1028):
RECHNUNGSCHECK(76)
(B)Main(41)
@XBPPUSHBUTTON@I@HANDLEEVENT(1556)
MAIN(53)
Call Stack of GUI Thread (1200):
File: d:\sani\Rechnungscheck 2020\fuelldatei.exe
TimeStamp: 20200115 10:34
End of FATAL ERROR LOG.

Andere Verzeichnisse haben bis zu 350.000 Dateien, da klappt es sogar sehr schnell.

Gibt es eine Möglichkeit diese Dateien einzulesen?

VG Rolf
VG Rolf
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von Tom »

Was steht in Zeile 76 von "RECHNUNGSCHECK"?
Herzlich,
Tom
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von Martin Altmann »

Wahrscheinlich ADir().
Zu viele Einträge für ein Array - Jan hatte mal von Alaska ein Tuning erhalten, um mehr als die normal mögliche Anzahl an ArrayEinträgen zu verwalten.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von Manfred »

oben steht doch error within the errorhandling. Heißt das nicht, das er einen Fehler in seiner Fehlerroutine hat?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von Tom »

Oder es ist ein Zustand entstanden, der selbst das Laufzeitfehlersystem aushebelt.
Herzlich,
Tom
DerRolf
UDF-Programmierer
UDF-Programmierer
Beiträge: 76
Registriert: Mi, 10. Sep 2014 9:53
Hat sich bedankt: 3 Mal

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von DerRolf »

Tom hat geschrieben: Mi, 15. Jan 2020 11:09 Was steht in Zeile 76 von "RECHNUNGSCHECK"?
Das ist die Funktion.
VG Rolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von brandelh »

Error within the error handling!

zusammen mit dem FATAL ERROR deuten auf eine Endlosschleife zwischen Code und Errorhandler hin bis der Stack weg ist.
Ob es erlaubt ist ein Array mit 1,3 Millionen Verzeichnis Infos anzulegen ist aber eine ganz andere Frage !
Hier habe ich keines das so groß wäre ... und verzweifle dennoch bis Win 7 oder 10 das Verzeichnis endlich im Explorer anzeigt.
Gruß
Hubert
DerRolf
UDF-Programmierer
UDF-Programmierer
Beiträge: 76
Registriert: Mi, 10. Sep 2014 9:53
Hat sich bedankt: 3 Mal

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von DerRolf »

Martin Altmann hat geschrieben: Mi, 15. Jan 2020 11:11 Wahrscheinlich ADir().
Zu viele Einträge für ein Array - Jan hatte mal von Alaska ein Tuning erhalten, um mehr als die normal mögliche Anzahl an ArrayEinträgen zu verwalten.

Viele Grüße,
Martin
Ich habe es mit Directory() gemacht.
Werde es mit Adir() versuchen.

Gibt es das Tuning irgendwo zum download?
VG Rolf
DerRolf
UDF-Programmierer
UDF-Programmierer
Beiträge: 76
Registriert: Mi, 10. Sep 2014 9:53
Hat sich bedankt: 3 Mal

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von DerRolf »

Adir() bringt die gleiche Fehlermeldung.
VG Rolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von brandelh »

The function ADir() exists only for compatibility reasons. Instead of ADir(), the function Directory() should be used. Directory() returns the file information in a two dimensional array.
mit ADIR() kannst du wohl die Anzahl der Elemente begrenzen, damit fehlen aber auch immer welche ...

12 Defines gibt es, also erzeugt directory ein Array mit n x 12 Elementen, ADIR() jeweils 6 einzelne Arrays (die müssen wohl bestehen ?) je Datei, somit könnte das weniger problematisch sein, aber 1,3 Millionen Elemente im Array
ist zu viel. JAN hatte extra Parameter von Alaska erhalten für sehr große Arrays.

Was genau willst du damit eigentlich machen ?
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von Jan »

Martin Altmann hat geschrieben: Mi, 15. Jan 2020 11:11Wahrscheinlich ADir().
Zu viele Einträge für ein Array - Jan hatte mal von Alaska ein Tuning erhalten, um mehr als die normal mögliche Anzahl an ArrayEinträgen zu verwalten.
Das ist richtig. Allerdings übersteigen 1,3 Mio. Sätze auch deren Fähigkeiten. Standardeinstellung von Alaska ist glaube ich 300.000 Sätze, mit den Hinweisen von Alaska habe ich das glaube ich auf 1.000.000 hochgetrieben. Dann war auch da Schluß.

Wobei ich mir auch vorstellen kann das da irgendwann der RAM ausgeht. Kommt auf die Größe der Sätze an.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
DerRolf
UDF-Programmierer
UDF-Programmierer
Beiträge: 76
Registriert: Mi, 10. Sep 2014 9:53
Hat sich bedankt: 3 Mal

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von DerRolf »

brandelh hat geschrieben: Mi, 15. Jan 2020 11:37
The function ADir() exists only for compatibility reasons. Instead of ADir(), the function Directory() should be used. Directory() returns the file information in a two dimensional array.
mit ADIR() kannst du wohl die Anzahl der Elemente begrenzen, damit fehlen aber auch immer welche ...

12 Defines gibt es, also erzeugt directory ein Array mit n x 12 Elementen, ADIR() jeweils 6 einzelne Arrays (die müssen wohl bestehen ?) je Datei, somit könnte das weniger problematisch sein, aber 1,3 Millionen Elemente im Array
ist zu viel. JAN hatte extra Parameter von Alaska erhalten für sehr große Arrays.

Was genau willst du damit eigentlich machen ?
Das sind automatisch generierte Rechnungdateien.
Die müssen mit anderen Protokollen gegengecheckt werden.
Im Dateinamen steht die Rechnungsnummer. Nur diese brauche ich für die Suche in den Protokollen.
Aber dafür muss ich das Verzeichnis einlesen.
VG Rolf
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von Jan »

DerRolf hat geschrieben: Mi, 15. Jan 2020 11:31Gibt es das Tuning irgendwo zum download?
Mail an Alaska schicken.

Das Problem ist: Die wissen das teilweise selber nicht. Oder meinen, mit der 2.0 wären die (von Alaska irgendwann mal aus Performancegründen eingebauten) Grenzen aufgehoben, und man braucht das nicht mehr. Es kann also möglicherweise eine unbefriedigende Antwort geben.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
DerRolf
UDF-Programmierer
UDF-Programmierer
Beiträge: 76
Registriert: Mi, 10. Sep 2014 9:53
Hat sich bedankt: 3 Mal

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von DerRolf »

Gibt es vielleicht eine Möglichkeit das Verzeichnis "Häppchenweise" einzulesen?
Erstmal von 1 bis 200000 dann vonn 200001 etc. ?
Ich brauche nur den Dateinamen.
VG Rolf
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von Jan »

Rolf,

Du kannst ja bei Directory() einen Filter angeben. Z. B. den Anfangsbuchstaben der Dateien, und dann gehst Du von a bis z alles einzeln durch.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von Manfred »

und wenn Du dann nur den namen oder so benötigst, dann empfehle ich Dir mal einen Blick hier drauf. Vielleicht kannst Du es ja benutzen. Aber erst ab Ver. 2.0
https://www.xbaseforum.de/viewtopic.php ... ct#p124452
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
DerRolf
UDF-Programmierer
UDF-Programmierer
Beiträge: 76
Registriert: Mi, 10. Sep 2014 9:53
Hat sich bedankt: 3 Mal

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von DerRolf »

Jan hat geschrieben: Mi, 15. Jan 2020 11:59 Rolf,

Du kannst ja bei Directory() einen Filter angeben. Z. B. den Anfangsbuchstaben der Dateien, und dann gehst Du von a bis z alles einzeln durch.

Jan
Das probiere ich gleich mal aus. Das würde mir schon helfen.
THx.!
VG Rolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von brandelh »

Musst du immer alle Dateien dieses Verzeichnisses erwischen ?

Es gibt grundsätzlich 3 Möglichkeiten ...

1. Betriebsystemfunktionen, früher war das mal FindFirst(), FindNext() ... in Basic, da hat man immer jede Datei einzeln gesucht. Dürfte langsam sein
2. UNIVERSAL SQL ... man kann ab der 2.00 mit SQL Befehl das Verzeichnis nach Dateien durchsuchen, dort könnte auch eine Schrittweite möglich sein.
3. DIR *.* /B > Verzeichnisdatei.txt, diese dann sequentiell mit z.B. meiner Funktion HBTextReader( cFile ) abarbeiten
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von brandelh »

UNIVERSAL SQL (der Link von Manfred, den ich nur so in Erinnerung hatte), wird nicht funktionieren, denn da wird Directory() als Datenquelle angegeben:
SELECT field1 AS name, field2 AS size FROM (Directory()) INTO objects adirectory
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von Manfred »

Hubert,
der Tipp bezog sich auf den Ratschlag von Jan. Der Vorfilter sorgt für weniger DAten.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von brandelh »

War nicht gegen dich gerichtet, ich hatte UNIVERSAL SQL erwähnt und danach bei dir nach der Syntax geschaut ...
da wird directory() verwendet, daher meine Korrektur, dass es so nicht geht.
Vorfilter sind ja ganz nett, aber es kann sein, dass auch ein Buchstabe am Anfang die Grenzen sprengt, daher nicht wirklich sinnvoll.

Ein anderes Problem ist, ob man damit rechnen muss, dass neue Dateien dazu kommen oder nicht.
Bei Directory() wird das ein Schnappschuss und gut ist, wenn man mit Datei Funktionen werkelt könnte es da ein Problem geben.
Ich denke, dass nur der Umweg über eine Datei mit Dateinamen und diese sequentiell zu verarbeiten sinnvoll ist, bei der Menge aber nicht mit MemoLine()
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von brandelh »

Hier zeigt Microsoft wie man mit FindFirstFile() etc. einzelne Dateien abfragt, die API Funktionen sollte man einbinden können:

https://docs.microsoft.com/en-us/window ... -directory

vermutlich sind das aber Unicode Daten in der Struktur und Strukturen lesen ist nicht sooo toll ;-)

Es gäbe noch eine Möglichkeit, wenn du für externe DLL offen bist ...

In PowerBasic könnte ich eine DLL Funktion erstellen, die die Arbeit macht und per DLLCALL die Arbeit erledigt.
Entweder in einer externen Datei alle Namen oder man übergibt die Nummer der Datei in der Liste ... bis ein "" zurückkommt (also die 1., 2. 3. 4. .... n. Datei anfordern)
Gruß
Hubert
DerRolf
UDF-Programmierer
UDF-Programmierer
Beiträge: 76
Registriert: Mi, 10. Sep 2014 9:53
Hat sich bedankt: 3 Mal

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von DerRolf »

brandelh hat geschrieben: Mi, 15. Jan 2020 12:05 Musst du immer alle Dateien dieses Verzeichnisses erwischen ?

Es gibt grundsätzlich 3 Möglichkeiten ...

1. Betriebsystemfunktionen, früher war das mal FindFirst(), FindNext() ... in Basic, da hat man immer jede Datei einzeln gesucht. Dürfte langsam sein
2. UNIVERSAL SQL ... man kann ab der 2.00 mit SQL Befehl das Verzeichnis nach Dateien durchsuchen, dort könnte auch eine Schrittweite möglich sein.
3. DIR *.* /B > Verzeichnisdatei.txt, diese dann sequentiell mit z.B. meiner Funktion HBTextReader( cFile ) abarbeiten
Hi.
Ich versuche es mit der Variante 3. Dir > "datei".
Die Dateinamen beginnen mit Zahlen. 43 bis 54. Somit fällt der Filter auch weg. Es soll eine unbeaufsichtige Anwendung sein.
Dein Proggi, welches eine Datei mit den Dateinamen liefert würde auch passen.
Danke dir.
VG Rolf
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von Jan »

DerRolf hat geschrieben: Mi, 15. Jan 2020 14:59Die Dateinamen beginnen mit Zahlen. 43 bis 54. Somit fällt der Filter auch weg.
Wieso? Du kannst doch z. B. so durchlaufen:

Code: Alles auswählen

FOR i := 43 TO 54
    aDirectory :=  Directory(Var2Char(i) + "*.txt")
NEXT
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Directory() Verzeichnis mit 1,3 Mio Dateien

Beitrag von brandelh »

Ich habe hier 1,2 Millionen Testdateien erzeugt, der DIR /b > Test.csv dauert knapp 7 Sekunden (I5 2550, SSD),
ich denke das wird Welten schneller sein, als 1,3 Millionen mal find first und find next aus Xbase heraus aufzurufen.
HBTextReader( cFile ) ... selbst arbeitet intern mit einem 4 K Buffer, und liest von der Platte, somit keine Größenbegrenzung !

Meine Test.csv war etwa 70 MB groß, im RAM mit memoline macht das keinen Spaß mehr ;-)
Gruß
Hubert
Antworten