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

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

Beitrag von DerRolf »

Jan hat geschrieben: Mi, 15. Jan 2020 15:04
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
Diese Zahlen werde immer weiter hochgezählt.
Das war nur ein Beispiel wie es jetzt ist.
Nächstes Jahr wird es so etwas wie 55 bis 63 sein, und so weiter.
Es sind 8 stellige fotlaufende Nummern.

Ist aber auf jeden Fall ein guter Ansatz.
THX.
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,

wenn das jedes Jahr hochgezählt wird kannst Du das ja so lange in die Schleife schicken, bis die Rückgabe leer ist. Das wäre dann sozusagen das Folgejahr, wo es noch keine Dateien gibt.

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: 15688
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 »

Man erinnere sich an die Sortierregeln ;-)

Solange man nicht mit führenden "0" gearbeitet hat, stimmt die nie:

so stimmt die Sortierung, aber man legt sich gleich fest auf die maximale Anzahl an Dateien

Code: Alles auswählen

0000000001 // max 9.999.999 Dateien
0000000002
0000000003
0000000004
etc. 
Vermutlich sieht es eher so aus (unsortiert):

Code: Alles auswählen

1.txt
2.txt
3.txt
4.txt
5.txt
6.txt
7.txt
8.txt
9.txt
10.txt
11.txt
...
1111111111111111111111111111.txt
dir 1*.txt ... wird mit der Zeit sehr viele Treffer aus allen Regionen haben

sortiert:

Code: Alles auswählen

1.txt
10.txt
11.txt
...
1111111111111111111111111111.txt
2.txt
...
3.txt
...
4.txt
...
5.txt
...
6.txt
...
7.txt
...
8.txt
...
9.txt
...
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 »

Die Datei Dir > "Datei" ist 100MB groß.
Mal sehen, ob ich die vernünftig verarbeiten kann.
VG Rolf
Benutzeravatar
BJelinek
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 218
Registriert: Sa, 02. Jun 2012 20:57
Wohnort: 73257 Köngen
Hat sich bedankt: 9 Mal
Danksagung erhalten: 3 Mal

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

Beitrag von BJelinek »

Hallo Rolf,

DIR /B > Dateiname enthält dann nur die Dateinamen.

Dürfte kleiner sein und man kann eine Zeile verwenden.
Grüße
Bernd

Mitglied des Deutschsprachige Xbase-Entwickler e. V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

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

Beitrag von ramses »

Das geht doch noch viel einfacher mit den beiden Windows API Funktionen FindFirstFileA() und FindNextFileA()
Nach dem Aufruf von FindFirstFileA() können in einer Schlaufe mit FindNextFileA() File Namen ohne Limit eingelesen werden.

Oder mit der FileSeek() Funktion aus den xbTools. Nach dem selben Muster.

Auszug aus der Dokumentation:
This is a string specifying the file(s) to seek. It may contain a fully qualified filename or "wild cards" (eg: "C:\DATA\*.NTX" ). The parameter must be specified with the first call. Any subsequent calls to FileSeek() without passing parameters return the next filename which matches the initial parameters.
Valar Morghulis

Gruss Carlo
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag von AUGE_OHR »

hi Carlo,
ramses hat geschrieben: Mi, 15. Jan 2020 20:53 Das geht doch noch viel einfacher mit den beiden Windows API Funktionen FindFirstFileA() und FindNextFileA()
Nach dem Aufruf von FindFirstFileA() können in einer Schlaufe mit FindNextFileA() File Namen ohne Limit eingelesen werden.
na da bis du doch auf einem schnelleren Weg per API denn bis hier nutzt auch DIRECTORY() die API Function.
dann kommt das "Problem" denn beim Aufbau des Array wird jedes Element "einzeln verarbeitet".

---

wie wäre eine Listbox und API :-"

damit meine ich natürlich nicht den Weg eine ListBox mit o:AddItem() zu füllen [-X
es war eins meiner ersten "Aha" Erlebnisse als ich mit Petzold und Windows API angefangen habe.
https://books.google.de/books?id=Rp1CAw ... Y&f=false

Code: Alles auswählen

PROCEDURE PimpMyXb(oListBox)   // Forum-Konferenz 2016
LOCAL hWnd
LOCAL iAttr
LOCAL cMask

   hWnd  := oListBox:getHWND()
   iAttr := DDL_READWRITE + DDL_DIRECTORY
   cMask := "*.*"
   SendMessageA( hWnd, LB_DIR, iAttr , cMask )

RETURN
damit sind 1.000.000 Einträge und mehr grundsätzlich möglich ... ob es XbpListBox() "verträgt" hab ich noch nicht ausprobiert.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
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 »

FileSeek() entspricht den API Funktionen, das hab ich glatt übersehen,
ich denke aber, dass DIR /B wesentlich schneller ist.
Gruß
Hubert
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

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

Beitrag von ramses »

DIR /b ist jedoch nicht unbedingt eine gute Lösung weil das ganze viel umständlicher wird. Du musst nicht nur sorge tragen dass eine einmalige Datei verwendet wird es benötigt viel mehr Programmzeilen und einen Shell Aufruf.
Valar Morghulis

Gruss Carlo
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 »

Ich habe jetzt die Datei aus DIR > Datei.txt (100MB) verarbeitet.
Sowohl MemoRead, als auch mit Fopen kann ich die Datei lesen.

Aber die weitere Verarbeitung ist extrem langsam.
Auch ein Array mit 1,3 Mio Einträgen scheint problemlos zu funktionieren.

Aber sehr langsam.
Ich habe es bisher noch nicht durchlaufen lassen, aber es wird wohl 3 bis 5 Stunden brauchen...

Wäre evtl. "Append from " nicht schneller?
VG Rolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
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 fasse es nicht !

was habe ich zu Memoread etc. geschrieben ? Langsam (hauptsächlich bei der Weiterverarbeitung) und in der Größe der Datei begrenzt.

Diese Methode funktioniert nur mit meiner HBTextReader() Klasse !

Beispiel folgt.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
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 »

Beispiel der Funktion, welche die mit DIR erzeugte Datei (das dauert fast 10 Sekunden) durchsucht:

Code: Alles auswählen

*----------------------------------------------------------------
procedure TesteDIR()
   local nDauer, cTempFile, oTR, cCMD
   local nFile, cFile

   @14,17 say "TesteDIR()"
   set console off
   ?
   ? "Aktion: TesteDIR()", date(), time()
   ?

   nDauer := seconds()

   cTempFile := ExePath()+"TMP"+alltrim(str(seconds(),12,0))+".txt"

   ? "Temporäre Datei erstellen: ", cTempFile
   ? "Start: ",date(),time()

   cCMD := "/C DIR "+DQ()+ExePath()+"Daten\*.*"+DQ()+" /B > "+DQ()+cTempFile+DQ()

   ? "RunShell() mit DIR /B:     ",;             // Rückgabewert anzeigen
     RunShell( cCMD ) // Eventuelle Blanks berücksichtigen
   ? "Ende:  ",date(),time(),"Länge der Datei:", filesize(cTempFile)

   oTR := HBTextReader( cTempFile ) // per Funktion

   if oTR:FError() <> 0
      @20,1 say "Fehler beim Datei öffnen: "+oTR:ErrMsg()
      ? "Fehler beim Datei öffnen: "+oTR:ErrMsg()
      inkey(30)
      quit
   endif

   do while ! oTR:EOF()

      cFile := oTR:GetLine() // zuerst den Dateinamen holen, intern wird auf nächste Zeile gesetzt
      nFile := oTR:RecNo()   // dann stimmt die RecNo dieses Namens

      // Wie sich herausstellte sind die Dateinamen in der temporären Datei in OEM !!!
      // Dateifunktionen sind meist aber ANSI ... besser Umlaute vermeiden ;-)

      cFile := ConvToAnsiCP( cFile )

      MyAction( nFile, cFile )

   enddo

   oTR:Destroy()
   delete file (cTempFile)

   nDauer := seconds() - nDauer

   set console off

   ? "Ende des Durchlaufes, Dauer:",nDauer,"Sekunden, oder ",nDauer/60,"Minuten, oder ",nDauer/3660,"Stunden"

   set console on

return
Das Verhalten ist so, dass man 10 Sekunden wartet (bis DIR durch ist) und danach ist das Programm auch gleich fertig. 1,25 Millionen Einträge in der DIR Datei
Das Warten ist nicht so schön, nun schaue ich mal das Beispiel für FindFile() --- findet auch Verzeichnisse, so ein Mist.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
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 »

Beispiel mit FindFile() sieht eleganter aus:

Code: Alles auswählen

*----------------------------------------------------------------
procedure TesteFindFile()
   local nDauer, cFile, nFile, cSuchString
   @14,17 say "TesteFindFile()"
   set console off
   ?
   ? "Aktion: TesteFindFile()"
   ?
   nDauer := seconds()
   set console on
   cSuchString := ExePath()+"Daten\*.*"
   cFile := FileSeek( cSuchString ) // kann auch Verzeichnisse enthalten !!!
   nFile := 0
   set console off
   ? "Erste Datei gefunden ?", cFile, FileAttr( ExePath()+"Daten\"+cFile )
   set console on
   do while ! empty(cFile)
      if FileAttr( ExePath()+"Daten\"+cFile ) = FA_DIRECTORY
         // Verzeichnisse ignorieren !
         set console off
         ? "Verzeichnis:", cFile, "Verzeichnis ignorieren ! FA:", FileAttr( ExePath()+"Daten\"+cFile )
         set console on
      else
         nFile++
         MyAction( nFile, cFile )
      endif
      cFile := FileSeek()
   enddo
   nDauer := seconds() - nDauer
   set console off
   ? "Ende des Durchlaufes, Dauer:",nDauer,"Sekunden, oder ",nDauer/60,"Minuten, oder ",nDauer/3660,"Stunden"
   set console on
return
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
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 hatte ein SLEEP(1) im Quellcode, das hatte stark gebremst. Ohne geht es sehr schnell, mit sleep(0) kostet es etwa 50 %.
Auf jedem Fall ist es so machbar, das Erstellen der Testdateien hat viel länger gedauert (eine EXE ist in der ZIP enthalten, mit PowerBasic Quellcode) :-)

Ergebnis:

TesteFindFile() :arrow: Gesamtlaufzeit: 52,28 Sekunden
TesteDIR() :arrow: Gesamtlaufzeit: 18,01 Sekunden, davon Dauer für DIR /B : 9,18 Sekunden, somit verarbeitet meine Klasse die 1,27 Millionen Datensätze in 9 Sekunden !

Die ZIP hänge ich hier noch an.

Hier ist das Protokoll (Auszug) mit Sleep(0):


Code: Alles auswählen

Start von TestDirRead 16.01.2020 14:22:22

ExePath():  D:\TEST\MaxDir\


Aktion: TesteFindFile()

Erste Datei gefunden ? .         16
Verzeichnis: . Verzeichnis ignorieren ! FA:         16
Verzeichnis: .. Verzeichnis ignorieren ! FA:         16
Datei:          1 Täöü_0000001.txt gefunden ?  J Time: 14:22:23
Datei:       1001 Täöü_0001001.txt gefunden ?  J Time: 14:22:24
Datei:       2001 Täöü_0002001.txt gefunden ?  J Time: 14:22:24
...
Datei:    1270001 Täöü_1270001.txt gefunden ?  J Time: 14:23:15
Datei:    1271001 Täöü_1271001.txt gefunden ?  J Time: 14:23:15
Datei:    1272001 Täöü_1272001.txt gefunden ?  J Time: 14:23:15
Ende des Durchlaufes, Dauer:         52,28 Sekunden, oder           0,87 Minuten, oder           0,01 Stunden

Aktion: TesteDIR() 16.01.2020 14:25:06

Temporäre Datei erstellen:  D:\TEST\MaxDir\TMP51907.txt
Start:  16.01.2020 14:25:06
RunShell() mit DIR /B:               0
Ende:   16.01.2020 14:25:15 Länge der Datei:   22908114
Dauer für DIR /B :          9,18 Sekunden
...
Datei:        328 Täöü_0000328.txt gefunden ?  J Time: 14:25:15
Datei:       1328 Täöü_0001328.txt gefunden ?  J Time: 14:25:15
Datei:       2328 Täöü_0002328.txt gefunden ?  J Time: 14:25:15
...
Datei:    1270328 Täöü_1270328.txt gefunden ?  J Time: 14:25:24
Datei:    1271328 Täöü_1271328.txt gefunden ?  J Time: 14:25:24
Datei:    1272328 Täöü_1272328.txt gefunden ?  J Time: 14:25:24
Ende des Durchlaufes, Dauer:         18,01 Sekunden, oder           0,30 Minuten, oder           0,00 Stunden
Programmende
Dateianhänge
MaxDir.zip
(32.34 KiB) 278-mal heruntergeladen
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
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 »

ramses hat geschrieben: Do, 16. Jan 2020 8:38 DIR /b ist jedoch nicht unbedingt eine gute Lösung weil das ganze viel umständlicher wird.
Du musst nicht nur sorge tragen dass eine einmalige Datei verwendet wird es benötigt viel mehr Programmzeilen und einen Shell Aufruf.
Wie ich vermutet hatte, ist DIR /B > d.txt einiges schneller.
Ob es so umständlich ist, muss jeder selbst wissen,
aber ich gebe dir Recht, dass die FindFile() Lösung in der Gesamterscheinung flüssiger wirkt, und im Endergebnis dürften beide schnell genug sein.
Hinzu kommt dass die nötige Verarbeitung in der Prüfroutine (MyAction) vermutlich aufwändiger sein wird und dann gleicht sich das näher an.
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

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

Beitrag von Koverhage »

Was soll daran umständlich sein. Das mit dem doppelten Namen ist doch einfach
cCreationtime := strtran(time(),":")+.txt"
DIR /B >(cCreationtime)
Gruß
Klaus
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

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

Beitrag von ramses »

Hallo

Die nachfolgende Variante ist mit Abstand in der Verarbeitung ultimativ schnellste Lösung.
Ohne die verhassten Shell Aufrufe und das verwenden externer Dateien oder viel interner Speicher Resourcen.
Es greift direkt und ohne Umwege über die API auf den Kernel zu.
Und liefert auch den Shortnamen der für einige Dinge (auch heute) noch benötigt wird.
Es benötigt jedoch ot4xb.


Code: Alles auswählen

#include "ot4xb.ch"
// ---------------------------------------------------------------------------


function main()
local oObj

    oObj  := findfile():new()

    oObj:findfile("e:\*.*")
    do while  !empty( oObj:cFilenameLong)

        if bAnd(oObj:nAttr, 0x80 ) =  0x80 .or. bAnd(oObj:nAttr, 0x20 ) =  0x20    // nur Einträge mit gesetztem normal  oder archiv Bit Auswählen 

           ? oObj:cFilenameLong

        endif

        oObj:findfile()
    enddo

    oObj:close()

    wait

return(nil)




// --------------------------------------------------------------------------

class findfile
      exported
      var nHandle, nAttr, cfilenameLong, cFilenameShort
      method init, findfile, close
endclass

method findfile:init()
           ::nHandle := -1
           ::cfilenameLong  := ""
           ::cFilenameShort := ""
           ::nAttr := 0
return(self)

method findfile:findfile(cMask,nAttr)
local ret_val := "", oNetR, nRet


          ::cfilenameLong  := ::cFilenameShort := ""
          oNetR := NETRESOURCE():new()
          oNetR:_alloc_()

          if cMask = nil
             nRet := @Kernel32:FindNextFileA(::nHandle, @oNetR )
          else
             if nAttr != nil
               oNetR:nAttribute := nAttr
             endif
             ::nHandle := nRet := @Kernel32:FindFirstFileA(cMask, @oNetR )
          endif
          ::nAttr := oNetR:nAttribute
          if nRet > 0
             ret_val :=  alltrim(oNetR:cFilename)
             ::cfilenameLong  := oNetR:cFilename
             ::cFilenameShort := oNetR:cAltName
          endif
          oNetR:_free_(.F.)

return(ret_val)


method findfile:close()

     if ::nHandle > 0
        if @Kernel32:FindClose(::nhandle) == 0
           msgbox( "Error FileClose")
        endif
     endif

return(nil)

BEGIN STRUCTURE NETRESOURCE
   MEMBER DWORD nAttribute
   MEMBER @ FILETIME  cT
   MEMBER @ FILETIME  AT
   MEMBER @ FILETIME  LT
   MEMBER DWORD nSizeH
   MEMBER DWORD nSizeL
   MEMBER DWORD nRes0
   MEMBER DWORD nRes1
   MEMBER szstr cFilename size 260
   MEMBER szstr cAltName size 14
END STRUCTURE





Valar Morghulis

Gruss Carlo
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag von AUGE_OHR »

hi,

@Huber : wie hast du dir die 1.000.000 Test-Daten erstellt :?:

@Carlo : hast du den Tip mit einer Listbox ausprobiert :?:

ich habe nicht so viele Dateien in einem Ordner und hoch skalieren kann man schlecht wenn er immer nur 1 Sec. anzeigt.
wie schon gesagt geht es um die Anforderung von Speicher die du für das abschließende Array benötigst.

ich zeige die Listbox dann gar nicht an sondern hole mit mit GetItem(nPos) den Inhalt.
die (unsichtbare) Listbox "ist" somit mein Array nur das ich es nicht (nachträglich) "füllen" muss

Windows kann den Speicher "als Block" vorab reservieren was z.b. der Explorer macht.
Er ist auch schnell ... wenn er keine Icon anzeigt

nun ist ein Listview im Grunde das selbe wie mehrere Listboxen und beide haben die Möglichkeit File-System-Dateien "im Block" einzulesen.
gruss by OHR
Jimmy
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 »

Eine Million Testdateien zu erzeugen, ist ein Dreizeiler mit Xbase++-Bordmitteln:

Code: Alles auswählen

FOR I := 1 TO 1000000
  TempFile(<cPath>,<cExtension>)
NEXT
Was Du mit immer Deiner Listbox willst, ist mir auch nicht klargeworden, Jimmy. Wer braucht denn hier Listboxen?
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag von AUGE_OHR »

Tom hat geschrieben: Do, 16. Jan 2020 20:08 Was Du mit immer Deiner Listbox willst, ist mir auch nicht klargeworden, Jimmy. Wer braucht denn hier Listboxen?
wie ich schon sagte "anders denken" :!:
es ist doch egal wie ich die Daten "im" Speicher habe. Die Frage ist wie bekomme ich die am schnellsten dort "rein"

auch wenn Carlo mit per FindFile API arbeitet müsste er die noch in ein Array übertragen und je grösser mit ADD() das Array wird um so langsamer wird es.

p.s. TempFile() ist eine XbTools Function ...
gruss by OHR
Jimmy
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

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

Beitrag von ramses »

Hallo Jimmy
AUGE_OHR hat geschrieben: Do, 16. Jan 2020 19:44 @Carlo : hast du den Tip mit einer Listbox ausprobiert :?:
Nein. DerRolf wollte ja die Dateien verarbeiten. Ich verwende die filefind Klasse schon länger um ganze Laufwerk mit vielen Mio. Files in allen Pfaden zu prüfen/einzulesen. Also auch zu verarbeiten.

Und nein. Ich fülle die Daten / Namen nicht in Array ab sondern in eine Datenbank ...... So grosse Arrays machen doch keinen Sinn.
Valar Morghulis

Gruss Carlo
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 »

Müssen die Daten überhaupt noch in ein Array, wenn sie sowieso linear eingelesen werden?
Und die Tools-Funktionen sind bei Xbase 2.0 enthalten.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
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 »

Die Arrays waren ja das Problem, wenn man die einfache Funktion directory() nutzen will bei so vielen Dateien.
Ramses und meine Lösung geht dahin, das man den einzelnen Dateinamen erhält und verarbeitet, ohne Arrays überlasten zu müssen.
Man denkt häufig, dass alles im RAM immer schneller ist, das stimmt aber nicht wenn es so riesige Daten sind.

Ob Paplos FindFile Class schneller als die Xbtools Funktion ist, könnte ich morgen nochmal prüfen, aber ich denke das geht so schon schnell genug.
Nun muss man sich nur noch entscheiden :wink:
Gruß
Hubert
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

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

Beitrag von ramses »

brandelh hat geschrieben: Do, 16. Jan 2020 21:34 Ob Paplos FindFile Class schneller als die Xbtools Funktion ist, könnte ich morgen nochmal prüfen, aber ich denke das geht so schon schnell genug.
Hallo Hubert

ich denke die FileFind Funktion ist schneller weil du mit der XBTool Funktion zusätzliche Aufrufe benötigts um die Art des Names herauszufinden bezw. File oder Verzeichnis ........ getestet habe ich es jedoch noch nie. Ich habe die Klasse gebaut weil ich oft auch die jeweiligen Short-Namen benötige und die liefern die XBTools nicht.
Valar Morghulis

Gruss Carlo
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
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 »

ramses hat geschrieben: Do, 16. Jan 2020 22:07 Ich habe die Klasse gebaut weil ich oft auch die jeweiligen Short-Namen benötige und die liefern die XBTools nicht.
oh du warst das, ich hatte es Pablo unterstellt, sorry :oops:

Morgen mach ich mal den Test.

@ Jimmy

Ich habe mir ein kleines Powerbasic Programm geschrieben, die die Dateien erstellt, allerdings dauert das ab 500.000 immer länger.
Dieses inkl. Quellcode liegt in der ZIP. Aber wie Tom meinte, das ist auch mit Xbase auf verschiedenen Wegen möglich: fCreate(), StrFile(), set alternate etc.
Gruß
Hubert
Antworten