Seite 1 von 3

Directory() Verzeichnis mit 1,3 Mio Dateien

Verfasst: Mi, 15. Jan 2020 10:59
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

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

Verfasst: Mi, 15. Jan 2020 11:09
von Tom
Was steht in Zeile 76 von "RECHNUNGSCHECK"?

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

Verfasst: Mi, 15. Jan 2020 11:11
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

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

Verfasst: Mi, 15. Jan 2020 11:15
von Manfred
oben steht doch error within the errorhandling. Heißt das nicht, das er einen Fehler in seiner Fehlerroutine hat?

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

Verfasst: Mi, 15. Jan 2020 11:18
von Tom
Oder es ist ein Zustand entstanden, der selbst das Laufzeitfehlersystem aushebelt.

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

Verfasst: Mi, 15. Jan 2020 11:27
von DerRolf
Tom hat geschrieben: Mi, 15. Jan 2020 11:09 Was steht in Zeile 76 von "RECHNUNGSCHECK"?
Das ist die Funktion.

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

Verfasst: Mi, 15. Jan 2020 11:30
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.

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

Verfasst: Mi, 15. Jan 2020 11:31
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?

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

Verfasst: Mi, 15. Jan 2020 11:34
von DerRolf
Adir() bringt die gleiche Fehlermeldung.

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

Verfasst: Mi, 15. Jan 2020 11:37
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 ?

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

Verfasst: Mi, 15. Jan 2020 11:48
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

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

Verfasst: Mi, 15. Jan 2020 11:50
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.

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

Verfasst: Mi, 15. Jan 2020 11:50
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

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

Verfasst: Mi, 15. Jan 2020 11:55
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.

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

Verfasst: Mi, 15. Jan 2020 11:59
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

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

Verfasst: Mi, 15. Jan 2020 12:01
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

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

Verfasst: Mi, 15. Jan 2020 12:02
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.!

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

Verfasst: Mi, 15. Jan 2020 12:05
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

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

Verfasst: Mi, 15. Jan 2020 12:10
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

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

Verfasst: Mi, 15. Jan 2020 12:19
von Manfred
Hubert,
der Tipp bezog sich auf den Ratschlag von Jan. Der Vorfilter sorgt für weniger DAten.

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

Verfasst: Mi, 15. Jan 2020 12:35
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()

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

Verfasst: Mi, 15. Jan 2020 12:46
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)

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

Verfasst: Mi, 15. Jan 2020 14:59
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.

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

Verfasst: Mi, 15. Jan 2020 15:04
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

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

Verfasst: Mi, 15. Jan 2020 15:08
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 ;-)