Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Moderator: Moderatoren
- Eugeny Lutsenko
- 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?
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?
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?
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
hi,
unter 32 Bit wird es wohl nicht in "eine" DBF passen ...
unter 32 Bit wird es wohl nicht in "eine" DBF passen ...
gruss by OHR
Jimmy
Jimmy
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- 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?
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
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
Gruss Carlo
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
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:
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.
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:
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
Hubert
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 104 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?
Die Größe ist ja nur ein Kriterium. Die Frage die sich mir stellt, kann eine DBF 4 Millionen Sätze enthalten ?
Gruß
Klaus
Klaus
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
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.
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
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
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
Hubert
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1931
- 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?
m.e. ist hierbei eine Forxpro dbf besser geeignet. xbase bietet ja einen foxpro-treiber . aber 4 Millionen hatte ich auch noch nicht
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
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
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- HaPe
- 1000 working lines a day
- Beiträge: 996
- 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?
Hallo Zusammen !
Das geht schon ...
Die Daten werden jedes Jahr in eine Jahres-Tabelle ausgelagert wegen 2 GB Größe.
Ich habe eine Messdaten-DBF mit 35 Mio. SätzenIch habe laufende FOXCDX mit 2,5 Mio. Sätzen.
Das geht schon ...
Die Daten werden jedes Jahr in eine Jahres-Tabelle ausgelagert wegen 2 GB Größe.
--
Hans-Peter
Hans-Peter
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
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.
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
Hubert
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- HaPe
- 1000 working lines a day
- Beiträge: 996
- 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?
Hallo Hubert !
Die VFP-Tabellen sind maximal 2 GB groß; und den ADS kenne ich nur vom HörenSagen
Nein und nein.kann es sein, dass die DBFs die über 2 GB groß sind mit der ADS verwaltet werden ?
Die VFP-Tabellen sind maximal 2 GB groß; und den ADS kenne ich nur vom HörenSagen
--
Hans-Peter
Hans-Peter
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
hi,
anscheinend hat Eugene den Text geändert
---
es ist aber unter 64 Bit möglich bis 2^41 -> 2 TeraByte zu arbeiten
https://groups.google.com/forum/#!topic ... Fc6qLTERi8
anscheinend hat Eugene den Text geändert
DAS passt wohl kaum in eine DBF von einer 32 Bit App."How to enter a very large csv file (more than 400 million rows) into the database?".
---
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
Jimmy
- Eugeny Lutsenko
- 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?
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 Strukturbrandelh 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:
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.
- Dateianhänge
-
- 2.zip
- (2.37 KiB) 209-mal heruntergeladen
- Eugeny Lutsenko
- 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?
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.AUGE_OHR hat geschrieben: ↑Fr, 16. Okt 2020 17:26 hi,
anscheinend hat Eugene den Text geändertDAS passt wohl kaum in eine DBF von einer 32 Bit App."How to enter a very large csv file (more than 400 million rows) into the database?".
---
es ist aber unter 64 Bit möglich bis 2^41 -> 2 TeraByte zu arbeiten
https://groups.google.com/forum/#!topic ... Fc6qLTERi8Code: Alles auswählen
#include "dbinfo.ch" ... set( _SET_DBFLOCKSCHEME, DB_DBFLOCK_HB64 )
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
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.
sorry das hatte ich überlesen.HaPe hat geschrieben:Die VFP-Tabellen sind maximal 2 GB groß;
@ 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
Hubert
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Die Hilfe sagt zu FOXDBE:
JanTable 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Und wo widerspricht das meiner Aussage ?
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
hi,
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
! Note : as i use ACLONE() it need dupe Size of RAM so it work only up to 1 GB under 32 Bit Apps
Express++ hatEugeny 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
Code: Alles auswählen
FUNCTION DC_CSV2Array( cCsvFileName )
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
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
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.
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
Hubert
- Eugeny Lutsenko
- 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?
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
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
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
ach der Quellcode oben ... der ist gedacht um DBF mit verschiedenen Größen zu erstellen.
Was ich meinte ist in der Wissensbasis 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:
Was ich meinte ist in der Wissensbasis 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
Hubert
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2832
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 98 Mal
- Danksagung erhalten: 13 Mal
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
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?).
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.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.