Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von Eugeny Lutsenko »

Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Zum Beispiel Datei: train_V2.csv aus dieser Quelle: https://www.kaggle.com/c/pubg-finish-pl ... ction/data
Was ist der Quellcode des Programms, das Sie schnell tun können?
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: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von AUGE_OHR »

hi,

unter 32 Bit wird es wohl nicht in "eine" DBF passen ... [-X
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: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von ramses »

Jimmy

das ist so nicht richtig. Ohne Anpassung ist die DBF Grösse 1GB. (Clipper-Kompatibel)
Wird der Lockoffset höher gestellt passen ca. 2.4 GB in eine DBF.
Die Datei von Eugeny ist ca. 650MB gross, die passt sicher auch unter 32 Bit in eine DBF.
Siehe DOC von Alaska
DBFDBE_LOCKOFFSET

This constant returns or changes the offset for record locks. The offset for record locks determines the maximum size of the DBF table. The default offset for record locks is 1.000.000.000 or approx. 1GB. This corresponds to the maximum size of a Clipper-compatible DBF table.

To increase the storage capacity of DBF files to the current maximum of ~2.4GB, a locking offset of 0x80000000 must be configured. Changing the DBFDBE_LOCKOFFSET allows to extend the maximum file capacity of DBF tables beyond Clipper's capacity. However these DBF tables cannot be shared safely with Clipper due to the different locking offsets used to syncronize concurrent operations. The maximum value for DBFDBE_LOCKOFFSET is 0xFFFFFFFF.


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: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von brandelh »

4 Millionen Zeilen allein sind noch kein Problem, aber Zeilen * Anzahl Zeichen je Zeile + Header müssen unter der maximalen Dateigröße einer DBF bleiben: 2,4 GB (Lock offset richtig setzen !)

Der Sperroffset kann maximal dem Wert einer LONG entsprechen (&H7FFFFFFF), int -2147483648..2147483647 32 Bit
2147483647 / 4000000 Millionen Datensätze => etwa 500 Zeichen je Zeile sollten möglich sein, eventuell Textfelder ab 20 mit FOXDBE in eine Memodatei (FTP) auslagern.

Das Einlesen von Textdateien jeder Art kann mit meiner Funktion so schnell wie möglich erledigt werden:

:arrow: viewtopic.php?f=16&t=7961

dennoch sollte man sich bei großen Datenbeständen immer überlegen, ob man nicht besser einen SQL Server nutzt.

EDIT: ramses war schneller :-)

Aber Alaskas Text ist nicht ganz richtig.
Bei Clipper gab es da eine OBJ die man einsetzen konnte um auch auf die 2,4 GB zu kommen.
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: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von Koverhage »

Die Größe ist ja nur ein Kriterium. Die Frage die sich mir stellt, kann eine DBF 4 Millionen Sätze enthalten ?
Gruß
Klaus
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: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von brandelh »

Klaus probiere es aus ;-)

Die Satznummer wird ja nicht in der Datenzeile gespeichert, somit ist diese nur von der 2 Milliardengrenze (max LONG) begrenzt.

Ich hatte mal ein Testprogramm, das eine DBF mit einem numerischen Feld (15 Stellen) auf 113 Millionen Sätze gefüllt hat. Ob das Sinn macht ist eine andere Frage.
Eine Excel XLSX Datei kann max. 1 Million Datenzeilen enthalten.
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: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von brandelh »

Hier mal der Quellcode zum Testprogramm, falls es jemand testen will.

Code: Alles auswählen

#include "XBP.CH"
#include "DMLB.CH"
#include "DBFDBE.CH"
#include "ntxdbe.ch"
#include "Error.ch"

PROCEDURE DbeSys()
   IF !DbeLoad( "DBFDBE", .T. )
      ALERT( MSG_DBFDBE_NOT_LOADED, { "OK" } )
   ENDIF
   IF !DbeLoad( "NTXDBE", .T. )
      ALERT( MSG_DBFDBE_NOT_LOADED, { "OK" } )
   ENDIF
   IF !DbeBuild( "DBFNTX", "DBFDBE", "NTXDBE" )
      ALERT( MSG_DBFNTX_NOT_CREATED, { "OK" } )
   ENDIF
   DbeInfo( COMPONENT_DATA,  DBFDBE_LOCKOFFSET, 0xFFFFFFFF )
   DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0xFFFFFFFF )
   DbeSetDefault( "DBFNTX" )
RETURN

PROCEDURE Main
   local cDBF, nWahl
   set exclusive on
   set alternate to test.txt additive
   set alternate on

   cls

   @ 1,1 say " 1=7F, 2=8F, 3=FF, 4=FFv, 5=80 "

   nWahl := 2

   @ 2,1 get nWahl
   read

   do case
      case nWahl = 1
         cDBF := "Test_7F_exlusive.DBF"
         ? "Datei mit 0x7FFFFFFF - wo ich nur diesen Wert her habe ? ",0x7FFFFFFF
         DbeInfo( COMPONENT_DATA,  DBFDBE_LOCKOFFSET, 0x7FFFFFFF )
         DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0x7FFFFFFF )
      case nWahl = 2
         cDBF := "Test_8F_exlusive.DBF"
         ? "Datei mit 0x8FFFFFFF - Empfehlung von Alaska ? ",0x8FFFFFFF
         DbeInfo( COMPONENT_DATA,  DBFDBE_LOCKOFFSET, 0x8FFFFFFF )
         DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0x8FFFFFFF )
      case nWahl = 3
         cDBF := "Test_FF_exlusive.DBF"
         ? "Datei mit 0xFFFFFFFF - mehr geht nicht",0xFFFFFFFF
         DbeInfo( COMPONENT_DATA,  DBFDBE_LOCKOFFSET, 0xFFFFFFFF )
         DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0xFFFFFFFF )
      case nWahl = 4
         cDBF := "Test_FF_voreingestellt.DBF"
         ? "Datei mit 0xFFFFFFFF - in DbeSys() eingestellt",0xFFFFFFFF
      case nWahl = 5
         cDBF := "Test_80_exlusive.DBF"
         ? "Datei mit 0x80000000  ",0x80000000

         DbeInfo( COMPONENT_DATA,  DBFDBE_LOCKOFFSET, 0x80000000 )
         DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0x80000000 )


   end


   dbcreate( cDBF ,{{"SATZNR","N",18,0}} )
   use (cDBF)

   cls
   @ 1,1 say cDBF
   @ 2,1 say "Recno()"

   do while .t.
      append blank
      replace SATZNR with recno()
      if int(recno()/1000) = recno()/1000
         @ 2,15 say recno() picture "999,999,999,999"
      endif
   enddo
   inkey(10)

   RETURN

/*





   ? "Datei mit 0xFFFFFFFF"




*   DbeInfo( COMPONENT_DATA,  DBFDBE_LOCKOFFSET, 0xFFFFFFFF )
*   DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0xFFFFFFFF )


*/


*--------------------------------------------------------------------------------
FUNCTION IsRecNoOutOfDBF(nRecNo,nMaxByte) // nMaxByte muss mit der Dateil„nge per fSize() belegt sein !
   local IsEOF, nRecNoByte := (RecSize() * nRecNo ) + Header() + 1
   IsEOF := ( nRecNoByte > nMaxByte )
RETURN IsEOF
*--------------------------------------------------------------------------------
FUNCTION DbfFileSize()
RETURN ( (RecSize() * LastRec()) + Header() + 1 )
*--------------------------------------------------------------------------------
Function BeschreibeFehler(oError)
   ? " - oError:args         ", oError:args
   ? " - oError:description  ", oError:description
   ? " - oError:genCode      ", oError:genCode
   ? " - oError:subCode      ", oError:subCode
   ? " - oError:subSystem    ", oError:subSystem
   ? " - oError:OsCode       ", oError:OsCode, " => ",DosErrorMessage(oError:OsCode)
return nil
*--------------------------------------------------------------------------------
Function ntrim(nWert)
return alltrim(str(nWert))
*--------------------------------------------------------------------------------
Function CopyRecord(nQuelle, nZiel)
   local nFeldMax, nFeld, uWert, bSaveError, oError

   bSaveError := ErrorBlock()

   if (nQuelle)->(eof())
      return .f.
   endif

   ErrorBlock( {|e| Break(e)} )

   BEGIN SEQUENCE
      (nZiel)->(dbAppend())
      if neterr()
         ? "NetErr() meldet Fehler bei AuPos"
         inkey(10)
         quit
      endif
   RECOVER USING oError
      ErrorBlock( bSaveError )
      ? "Fehler bei DBAppend(), APAUFNR=",(nQuelle)->APAUFNR,", Feld ",nFeld,(nQuelle)->(fieldname(nFeld))," Feldinhalt ignorieren"
      BeschreibeFehler(oError)
      ? "Programm beendet nach Append-Fehler"
      quit
   END SEQUENCE

   nFeldMax  := (nQuelle)->(fcount())
   for nFeld := 1 to nFeldMax

      ErrorBlock( {|e| Break(e)} )

      BEGIN SEQUENCE
        uWert := (nQuelle)->(fieldGet(nFeld))
      RECOVER USING oError
        ErrorBlock( bSaveError )
        uWert := NIL
        ? "Fehler beim Lesen, APAUFNR=",(nQuelle)->APAUFNR,", Feld ",nFeld,(nQuelle)->(fieldname(nFeld))," Feldinhalt ignorieren"
        BeschreibeFehler(oError)
      END SEQUENCE
      if uWert <> NIL
         BEGIN SEQUENCE
            (nZiel)->(fieldPut(nFeld, uWert ))
         RECOVER USING oError
            ErrorBlock( bSaveError )
            ? "Fehler beim Schreiben, APAUFNR=",(nQuelle)->APAUFNR,", Feld ",nFeld,(nQuelle)->(fieldname(nFeld))," Feldinhalt: ",uWert,"Typ:",valtype(uWert)
            BeschreibeFehler(oError)
         END SEQUENCE
      endif
   next

   ErrorBlock( bSaveError )

return .t.
Gruß
Hubert
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von Rolf Ramacher »

m.e. ist hierbei eine Forxpro dbf besser geeignet. xbase bietet ja einen foxpro-treiber . aber 4 Millionen hatte ich auch noch nicht
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
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: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von Jan »

Ich habe laufende FOXCDX mit 2,5 Mio. Sätzen. Und eine, das war früher mal eine DBFNTX und wurde so wie sie war nur nach FOXCDX konvertiert, keine Daten mehr hinzugefügt, die hat aber auch 2,1 Mio. Sätze.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von HaPe »

Hallo Zusammen !
Ich habe laufende FOXCDX mit 2,5 Mio. Sätzen.
Ich habe eine Messdaten-DBF mit 35 Mio. Sätzen :badgrin:
Das geht schon ...

Die Daten werden jedes Jahr in eine Jahres-Tabelle ausgelagert wegen 2 GB Größe.
--
Hans-Peter
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: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von Jan »

Hallo Hans-Peter,

ja, die Größe ... Die größte dbf mit der ich je gearbeitet habe ist 6,1 GB groß. Und hat 99.842.748 Sätze. Das wurde dann aber auch wirklich sehr hakelig und langsam. Daher habe ich die dann jahreweise aufgesplittet. Resultat ist u. a. die oben aufgeführte dbf. Wo ich mich aber in den Tausendertrennungen vertan hab (man sollte Zahlen zählen können ...). Die hat 25 Mio. Sätze, nicht 2,5 Mio.

Wobei ich noch eine dbf mit 2,7 GB und (aktuelle Momentaufnahme) 2.172.914 Sätzen im Dauergebrauch habe. Zwei weitere sind mit 2,4 (2.110.174 Sätze) und 2,1 GB (1.689.606 Sätze) ebenfalls größer als 2 GB. Alles andere ist dann darunter.

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: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von brandelh »

Hallo Ihr beiden ...

kann es sein, dass die DBFs die über 2 GB groß sind mit der ADS verwaltet werden ?

Ich habe es nie geschafft, eine über 2 GB große DBF zu erstellen, wenn keine ADS würden mich die DBESYS Einstellungen interessieren.

PS: Natürlich kann unter NTFS jede Datei sehr viel größer werden als 2 GB (je nach System im Terrabyte Bereich), mir ist es mit der DBFDBE / FOXDBE nur nicht gelungen.
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: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von Jan »

Hubert,

ja, bei mir FOXCDX mit ADS 12.

Wobei das ja von der Dateigröße selber egal sein müsste. Denn die existiert bei FOXCDX ja trotzdem als eigenständige Datei. Nur ob der Zugriff noch sauber klappt kann vom ADS beeinflußt sein.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von HaPe »

Hallo Hubert !
kann es sein, dass die DBFs die über 2 GB groß sind mit der ADS verwaltet werden ?
Nein und nein.
Die VFP-Tabellen sind maximal 2 GB groß; und den ADS kenne ich nur vom HörenSagen :roll:
--
Hans-Peter
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: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von AUGE_OHR »

hi,

anscheinend hat Eugene den Text geändert
"How to enter a very large csv file (more than 400 million rows) into the database?".
DAS passt wohl kaum in eine DBF von einer 32 Bit App.

---

es ist aber unter 64 Bit möglich bis 2^41 -> 2 TeraByte zu arbeiten

https://groups.google.com/forum/#!topic ... Fc6qLTERi8

Code: Alles auswählen

#include "dbinfo.ch"
...
 set( _SET_DBFLOCKSCHEME, DB_DBFLOCK_HB64 )
gruss by OHR
Jimmy
Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von Eugeny Lutsenko »

brandelh hat geschrieben: Fr, 16. Okt 2020 9:38 4 Millionen Zeilen allein sind noch kein Problem, aber Zeilen * Anzahl Zeichen je Zeile + Header müssen unter der maximalen Dateigröße einer DBF bleiben: 2,4 GB (Lock offset richtig setzen !)

Der Sperroffset kann maximal dem Wert einer LONG entsprechen (&H7FFFFFFF), int -2147483648..2147483647 32 Bit
2147483647 / 4000000 Millionen Datensätze => etwa 500 Zeichen je Zeile sollten möglich sein, eventuell Textfelder ab 20 mit FOXDBE in eine Memodatei (FTP) auslagern.

Das Einlesen von Textdateien jeder Art kann mit meiner Funktion so schnell wie möglich erledigt werden:

:arrow: viewtopic.php?f=16&t=7961

dennoch sollte man sich bei großen Datenbeständen immer überlegen, ob man nicht besser einen SQL Server nutzt.

EDIT: ramses war schneller :-)

Aber Alaskas Text ist nicht ganz richtig.
Bei Clipper gab es da eine OBJ die man einsetzen konnte um auch auf die 2,4 GB zu kommen.
Hallo, Brandelh! Ich habe mir Ihren Testfall über einen Link zu einem anderen Thema (ähnlich diesem) angesehen. Ihr Beispiel von mir kompiliert und funktioniert sehr gut. Aber für mich ist es ein Problem, Ihr Beispiel so zu modifizieren, dass die Daten aus der csv-Datei in die dbf-Datei übertragen werden. auch wenn alle Felder textbasiert sind. Ich werde dann analysieren diese Datei selbst bestimmen die erforderlichen Feldgrößen und Datentypen und übertragen alles in eine dbf-Datei mit der gewünschten Struktur
Dateianhänge
2.zip
(2.37 KiB) 202-mal heruntergeladen
Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von Eugeny Lutsenko »

AUGE_OHR hat geschrieben: Fr, 16. Okt 2020 17:26 hi,

anscheinend hat Eugene den Text geändert
"How to enter a very large csv file (more than 400 million rows) into the database?".
DAS passt wohl kaum in eine DBF von einer 32 Bit App.

---

es ist aber unter 64 Bit möglich bis 2^41 -> 2 TeraByte zu arbeiten

https://groups.google.com/forum/#!topic ... Fc6qLTERi8

Code: Alles auswählen

#include "dbinfo.ch"
...
 set( _SET_DBFLOCKSCHEME, DB_DBFLOCK_HB64 )
Hey, Jimmy! Du hast Recht. Es ist meine Hand zitterte von den großen zahlen und es stellte sich heraus, dass eine zusätzliche null.
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: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von brandelh »

Jan hat geschrieben: Fr, 16. Okt 2020 14:29 Hubert,

ja, bei mir FOXCDX mit ADS 12.

Wobei das ja von der Dateigröße selber egal sein müsste. Denn die existiert bei FOXCDX ja trotzdem als eigenständige Datei. Nur ob der Zugriff noch sauber klappt kann vom ADS beeinflußt sein.

Jan
Der ADS nutzt mit Xbase++ inkompatible Sperrmechanismen und umgeht so das Problem mit dem Lock-Offset.
Außerdem können Sie intern natürlich auch die 64 Bit Zahlen nutzen, was die Alaska FOX / DBF Treiber nicht machen, da diese ja kompatibel sein müssen.

Bei allen meinen Tests war es mit 2,1 GB Schluss mit Fehlermeldung. Auch bei exklusivem Zugriff.
HaPe hat geschrieben:Die VFP-Tabellen sind maximal 2 GB groß;
sorry das hatte ich überlesen.

@ Jimmy,

nachträglich die Zahl geändert ? Das erklärt einiges ;-)

es ist sicherlich ein Unterschied zwischen 400 / 40 und 4 Millionen Datenzeilen.
Wenn dann hauptsächlich Textfelder verwendet werden die womöglich auch noch länger sind, dann ist da ganz schnell Feierabend.
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: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von Jan »

Die Hilfe sagt zu FOXDBE:
Table file size Limited to 2^31 bytes (2 gigabytes)
Max. number of fields 2038 *)
Max. number of records (2^31 - Header() - 1) / RecSize()
*) Xbase++ versions ealier than 1.90 support only 255 fields per table
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: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von brandelh »

Und wo widerspricht das meiner Aussage ?
Gruß
Hubert
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: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von AUGE_OHR »

hi,
Eugeny Lutsenko hat geschrieben: Fr, 16. Okt 2020 18:45 Aber für mich ist es ein Problem, Ihr Beispiel so zu modifizieren, dass die Daten aus der csv-Datei in die dbf-Datei übertragen werden. auch wenn alle Felder textbasiert sind. Ich werde dann analysieren diese Datei selbst bestimmen die erforderlichen Feldgrößen und Datentypen und übertragen alles in eine dbf-Datei mit der gewünschten Struktur
Express++ hat

Code: Alles auswählen

FUNCTION DC_CSV2Array( cCsvFileName )
wenn man die Dateien im Array hat kann man die maximale Länge suchen

i use this Code when Read a Excel Sheet to create a "optimzize" DBF

Code: Alles auswählen

FUNCTION FindMax( aNew, nRowStart, nRowEnd, nCol )
LOCAL aSeek      := ACLONE( aNew )                                    // use ACLONE() !
LOCAL nMax, nLen := 0
LOCAL bSaveError, i

   bSaveError := ERRORBLOCK()                                         // save Errorblock
   ERRORBLOCK( { | e | BREAK( e ) } )                                 // set new Errorblock
   BEGIN SEQUENCE

      // reduce to 1-Dim
      //
      AEVAL( aSeek, { | a, i | aSeek[ i ] := aSeek[ i ] [ nCol ] }, nRowStart )

      // delete Row before nRowStart
      //
      FOR i := 1 TO nRowStart - 1
         ADEL( aSeek, 1 )
         ASIZE( aSeek, LEN( aSeek ) - 1 )
      NEXT

      // be sure to have String
      //
      AEVAL( aSeek, { | a, i | aSeek[ i ] := ALLTRIM( VAR2CHAR( aSeek[ i ] ) ) } )

      // just sort to find Max
      //
      ASORT( aSeek,, ( nRowEnd - nRowStart + 1 ), { | c1, c2 | LEN( c1 ) > LEN( c2 ) } )
   RECOVER

   END SEQUENCE
   ERRORBLOCK( bSaveError )                                           // restore Errorblock

   // it is 1st Element
   //
   nLen := LEN( TRIM( aSeek[ 1 ] ) )
   aSeek := NIL

RETURN nLen
! Note : as i use ACLONE() it need dupe Size of RAM so it work only up to 1 GB under 32 Bit Apps
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: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von brandelh »

Ein Array schließt sich bei der Dateigröße automatisch aus.

Automatisch geht erstmal gar nichts.
Man muss tatsächlich z.B. mit meiner Klasse zuerst den ersten Satz einlesen, dort die Überschriften analysieren (ist Name gültig, will ich die Spalte, etc.).
Danach liest man die ganze Datei durch und sucht die maximale Länge jedes Feldes (Blanks am Ende eventuell kürzen).
Aus dieser Info kann man dann eine passende DBF und die Import-Routine bauen, eventuelle Plausis, Grundwerte, Konvertierungen müssen ebenso beachtet werden.
Gruß
Hubert
Benutzeravatar
Eugeny Lutsenko
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 108
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von Eugeny Lutsenko »

brandelh !
Das habe ich mir so vorgestellt. Aber ich weiß nicht, wo in Ihrem Beispiel Daten aus einer csv-Datei gelesen werden sollen, um Sie in dbf einzufügen
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: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von brandelh »

ach der Quellcode oben ... der ist gedacht um DBF mit verschiedenen Größen zu erstellen.

Was ich meinte ist in der Wissensbasis :arrow: viewtopic.php?f=16&t=7961

dort die HBTextReader.ZIP laden, in der HBTextReader.PRG gibt es oben ein Beispiel und unten ist die Klasse ...
hier ist ein Beispiel aus dem Quellcode:

Code: Alles auswählen

   nZeile := 0
   oTR := HBTextReader( cFile ) // per Funktion
   if oTR:FError() <> 0
      @ 5,1 say "Fehler beim Datei öffnen: "+oTR:ErrMsg()
      inkey(30)
      quit
   endif
   nSize := oTR:FSize()
   @ 1,1 say  "Testdatei sequentiell einlesen, Dateityp: "+oTR:FileType()
   @ 3,1 say  "DateigrӇe      "+transform(nSize,"###,###,###,###,###")
   nDauer := seconds()
   do while ! oTR:EOF()
      cZeile := oTR:GetLine() // aktuelle Zeile einlesen, Zeiger intern auf n„chste Zeile setzen !
      nZeile++                // oder oTR:RecNo() // beides m”glich !
      nBytes += len(cZeile)+iif(oTR:IsCrLf(),2,1) // CR+LF = 2 Byte
      // CSV Dateien mit ";" Trenner k”nnen zeilenweise ganz einfach in ein Array aufgeteilt werden:
      //
      // aZeile := Tokenize(cZeile, ";" ) // ot4xb.dll einbinden !
      if nZeile % 1000 = 0    //  je nach Anzahl alle 100 oder 1000 S„tze aufrufen
         @ 5,1 say  "gelesene Bytes    "+transform(nBytes,  "###,###,###,###,###")
         @ 6,1 say  "gelesene Zeilen   "+transform(nZeile,  "###,###,###,###,###")
         @ 7,1 say  "interne Zeilennr. "+transform(oTR:RecNo(),"###,###,###,###,###")
         @ 8,1 say  "Datenzeile:       "+left(cZeile,20)
      endif
   enddo
   oTR:Destroy()

Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von georg »

Hallo, Eugeny -


was ist Deine eigentliche Frage?

Es gibt da verschiedene Aspekte, beginnend mit der Dateigrösse, sich am Ende existiert. Das wurde hier ausreichend besprochen.

Oder geht es um das Einlesen der Datei? Das geht via DELDBE/SDFDBE oder fOpen(), fRead(), fClose() (oder viele andere Varianten).

Oder geht es um die Geschwindigkeit, wie man es am schnellsten gespeichert bekommt?


Leider kann ich die Datei nicht herunterladen, ohne mich zu registrieren, daher fehlen mir Informationen über den Aufbau (sind alle Datensätze gleich lang?).
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Antworten