Español
Foro

Translate beschleunigen (Translate$ oder nproc Translate)

 

Christof
Neuß
¡Hola,

Yo hexe veces otra vez con großen CSV-Archivos herum. Will esta möglichst rápidamente y simplemente en un SQLite-Datenbank überführen. Das funktioniert auch grundsätzlich, pero me está a algunos Stellen todavía a langsam.

2 Alternativen verfolge Yo gerade
a) Einlesen el CSV Satz para Satz, Anpassung a Insert-Befehl y einlesen
b) Aufbau uno passenden CSV-Expediente para el Import-Befehl el SQLite-Konsole y luego encima Batchdatei starten.

Variante a) es hier (primero) no maßgeblich, como Satz-Entrada eh más a langsam es.

En Variante b) bekomme Yo simplemente no hin, el SQLite-Konsole con un Parámetro a versehen, el TAB como Feldtrenner setzt (\t funktioniert no), por lo tanto möchte Yo el Expediente (a 1 GB groß) vorher vom TAB befreien y z.B. ";" como Feldtrenner conjunto. Yo lese dazu encima Blockread siempre 1.000.000 Bytes una, bearbeite esta y escribir ellos en un neue Expediente. Experimentiert Yo con Translate$ y Translate como nproc. Beide brauchen en me ca. 30 Sekunden, a ellos 1 MB geändert haben. Yo habe entonces el nproc algo abgeändert, como Yo sólo una Signo tauschen voluntad

Braucht aber fast genauso largo.

Sieht uno una Möglichkeit, dass todavía - entscheidend - a beschleunigen?

Es (auch) deshalb no bastante simplemente, el CSV-Archivos en un SQLite-DB a übertragen, porque Yo no siempre sicher vorher weiß, con welchem Signo el Felder getrennt son y si es una Expediente con einfachen oder WideChar es. Beide kriege Yo mittlerweile aber relativ rápidamente y sicher fuera.

Hier el komplette Code des Moduls:
nProc translateONE(cadena src,fnd,rpl)

    {

        long p=1,cc=len(src), akt=0
        caso cc<1 : volver src
        caso src=="" : volver ""
        caso fnd=="" : volver src
        long fndCH=fnd[1]
        cadena sret=""', akt=""

        mientras que 1

            {

                caso p > cc : romper

                if src[p]<>fndCH

                    {

                        akt=src[p]
                        sret=sret+chr$(akt)

                    } más

                    {

                        sret=sret+rpl

                    }

                    add p,1
                    continue

                }

                volver sret

            }

            Proc CSV_in_SQLite_2'hier es con una Batchfile gearbeitet

                'Dateiname, el leerse se
                'Bezeichnung el Tabla en SQLite
                '0=keine Meldung, 1=MessageBox al Schluss
                Parámetros CSVDateiname$, EinleseTabelle$, MsgBox&
                Var TempErgebnis$="Temp_CSV_f_SQLite.CSV"
                Var IstWideChar&=0
                Var EinleseDaten$=""
                Declarar EinleseDaten#
                Var EinleseBytes&=1000000'Hier kann eingestellt voluntad, wieviele Bytes beim Blockread cada vez leerse
                Var Eingelesen&=0
                Var EinleseSatz$=""
                Var EinleseFelder$=""
                Var AnzEinleseFelder&=0
                Var FeldTrenner$=""
                Var SQLiteDLL&=db("slUseDLL","SQLite3.DLL")
                Var dbODVAss&=db("slInit","ODVAss.DB")
                Var SQLBefehl$=""
                Var x&=0
                Var XX&=Fortschritt()
                Var Zaehl&=0
                Borrar TempErgebnis$
                Asignar #1, CSVDateiname$ : OpenRW #1
                Asignar #2, TempErgebnis$ : OpenRW #2
                'Umwandlung en Expediente sin WideChar...
                Dim EinleseDaten#, EinleseBytes&
                Eingelesen&=Blockread(#1,EinleseDaten#,0,EinleseBytes&)

                if Char$(EinleseDaten#,0,1)=Chr$(255)'Expediente con WideChar

                    IstWideChar&=1

                endif

                if IstWideChar&=1

                    EinleseDaten$=EinleseDaten$+WideChar(EinleseDaten#,0,Eingelesen&)

                más

                    'normaler Zeichensatz
                    EinleseDaten$=EinleseDaten$+Char$(EinleseDaten#,0,Eingelesen&)

                endif

                EinleseFelder$=Left$(EinleseDaten$,InStr(Chr$(10),EinleseDaten$)-1)'Damit haben wir el Überschriften
                EinleseFelder$=Translate$(EinleseFelder$,Chr$(9),"¦")
                'Einlesedaten$ restos simplemente así. Dann son el Überschriften en el ersten Línea
                'EinleseDaten$ =Mid$(EinleseDaten$,InStr(Chr$(10),EinleseDaten$)+1,InStr(Chr$(0),EinleseDaten$)-Len(EinleseFelder$)-2) 'Damit son el Überschriften fuera

                if Instr(Chr$(0),EinleseDaten$)<>0

                    EinleseDaten$=Left$(EinleseDaten$,Instr(Chr$(0),EinleseDaten$)-1)

                endif

                Zaehl&=Zaehl&+Len(EinleseDaten$,Chr$(10))
                Imprimir "Anfang"
                EinleseDaten$=TranslateONE(EinleseDaten$,Chr$(9),"¦")
                Imprimir "Ende erster Satz"
                Blockwrite #2, EinleseDaten$

                WhileLoop 10000'Der Valor probablemente nie erreicht voluntad

                    SetText XX&, format$("###,###,###",&Loop)
                    Disponer EinleseDaten#
                    EinleseDaten$=""
                    Dim EinleseDaten#, EinleseBytes&
                    Eingelesen&=Blockread(#1,EinleseDaten#,0,EinleseBytes&)

                    if IstWideChar&=1

                        EinleseDaten$=WideChar(EinleseDaten#,0,Eingelesen&)

                    más

                        'normaler Zeichensatz
                        EinleseDaten$=Char$(EinleseDaten#,0,Eingelesen&)

                    endif

                    if Instr(Chr$(0),EinleseDaten$)<>0

                        EinleseDaten$=Left$(EinleseDaten$,Instr(Chr$(0),EinleseDaten$)-1)

                    endif

                    Imprimir "Anfang "+Str$(&Loop)
                    EinleseDaten$=TranslateONE(EinleseDaten$,Chr$(9),"¦")
                    Imprimir "Ende "+Str$(&Loop)
                    Zaehl&=Zaehl&+Len(EinleseDaten$,Chr$(10))
                    Blockwrite #2, EinleseDaten$

                    if eof(#1)

                        Romper

                    endif

                EndWhile

                Cerrar #1
                Cerrar #2
                'Erstellen Table en dbODVAss...
                'Datenbanktabelle redactar/bereinigen

                if db("slTableExists",dbODVAss&,EinleseTabelle$)<>0'Tabla existiert, entonces löschen

                    SQLBefehl$="Drop Table "+EinleseTabelle$
                    db("slSQLExec",dbODVAss&, SQLBefehl$,1)

                endif

                'Felder en Tabla Tab_Felder eintragen o. vorher vorhandene löschen

                if db("slTableExists",dbODVAss&,"Tab_Felder")<>0'Tabla existiert

                    SQLBefehl$="Delete from Tab_Felder where TabName='"+EinleseTabelle$+"'"
                    db("slSQLExec",dbODVAss&, SQLBefehl$,1)

                más

                    SQLBefehl$="Create Table Tab_Felder (TabName, FeldName, FeldBezei, FeldArt)"
                    db("slSQLExec",dbODVAss&, SQLBefehl$,1)

                endif

                'Feldtrenner en Originaldatei bestimmen

                if Len(EinleseFelder$,"¦")>Len(EinleseFelder$,";")

                    FeldTrenner$="¦"

                más

                    FeldTrenner$=";"

                endif

                if Len(EinleseFelder$,",")>Len(EinleseFelder$,FeldTrenner$)

                    FeldTrenner$=","

                endif

                'Felder de el aktuellen Tabla eintragen  ==> Feldtrenner es entonces una Komma
                EinleseFelder$=TranslateONE(EinleseFelder$,Chr$(9),";")
                EinleseFelder$=TranslateONE(EinleseFelder$,",",".")
                EinleseFelder$=TranslateONE(EinleseFelder$,";",",")
                EinleseFelder$=Translate$(EinleseFelder$,",,,",",0,0,")
                EinleseFelder$=Translate$(EinleseFelder$,",,",",0,")
                EinleseFelder$=Translate$(EinleseFelder$,", ,",",0,")
                EinleseFelder$=TranslateONE(EinleseFelder$,":","")
                AnzEinleseFelder&=Len(EinleseFelder$,",")

                WhileLoop AnzEinleseFelder&

                    SQLBefehl$="Insert into Tab_Felder (TabName, FeldName, FeldBezei) Values ('"+EinleseTabelle$+"','F"+Formato$("0000",&Loop)+"','"+Substr$(EinleseFelder$,&Loop,",")+"')"
                    db("slSQLExec",dbODVAss&, SQLBefehl$,1)

                EndWhile

                EinleseFelder$="("

                WhileLoop AnzEinleseFelder&'Danach son en EinleseFelder$ el (neuen) F...-Bezeichnungen

                    EinleseFelder$=EinleseFelder$+"F"+Formato$("0000",&Loop)+","

                EndWhile

                EinleseFelder$=left$(EinleseFelder$,Len(EinleseFelder$)-1)+")"
                SQLBefehl$="Create Table "+EinleseTabelle$+" "+EinleseFelder$
                db("slSQLExec",dbODVAss&, SQLBefehl$,1)
                db("slDone",dbODVAss&)
                FreeDll SQLiteDLL&
                'Einlesen Datensätze en dbODVAss...
                'SL-Expediente redactar
                Borrar "SQLite_Import.sl"
                Asignar #1, "SQLite_Import.sl" : Rewrite #1
                Imprimir #1, "Delete from "+EinleseTabelle$+";"
                'Imprimir #1, ".separator "+FeldTrenner$
                'Imprimir #1, ".mode csv"
                Imprimir #1, ".import Temp_CSV_f_SQLite.CSV "+EinleseTabelle$
                Cerrar #1
                'Batchdatei redactar
                Borrar "SQLite_Import.bat"

                if FeldTrenner$=Chr$(9)

                    FeldTrenner$=Chr$(34)+"\\t"+Chr$(34)

                endif

                Asignar #1, "SQLite_Import.bat" : Rewrite #1
                Imprimir #1, "@echo off"
                Imprimir #1, "SQLite3.exe -separator "+FeldTrenner$+" ODVAss.DB < SQLite_Import.SL"
                'Imprimir #1, "Pause"
                Cerrar #1
                ChDir $PROGDIR
                SQLBefehl$="SQLite_Import.bat"
                WinExecWait(SQLBefehl$,1)
                DestroyWindow(WegwerfFenster&)
                Borrar TempErgebnis$

                if MsgBox&=1

                    MessageBox("Daten fueron en el Datenbank geladen!","Meldung",0)

                endif

            ENDPROC


Merci y viele Grüße

Christof
 
XProfan X3
Win10 16 GB RAM
10.09.2018  
 




H.Brill
Hast du XProfanX4 ?
Wenn, entonces podría uno evtl. todavía qué beschleunigen,
indem uno el MoveListProc einsetzt. Como ha uno Zugriff
en todos Move("….ToList", ….) - Características.
Mit Move("FileToList, Expediente$) hättest du entonces Einzelzugriff
en jede Línea el Expediente. Dort könntest du entonces el Insert-
Befehl adaptar y luego direkt en el DB escribir.
El Listboxliste es entonces sólo Mittel para Zweck y se
no ausgewertet.

Yo empfehle lo deshalb, porque Rolands interne Schleifen
doch wesentlich más rápido laufen, como el eigenen en el
Programmcode. Man müßte wirklich veces a la realen
Test con großen Datenmengen hacer.
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
10.09.2018  
 




Christof
Neuß
Hi,

sí, Yo X4. Muss Yo veces ausprobieren. Bin me sólo no sicher, si el Liste tatsächlich encima 3 Mio. Zeilen aufnehmen/auswerten kann.

Trotzdem: Einen Intento ist's wert. Gracias para el Tipp!

Saludo

Christof
 
XProfan X4
Win10 16 GB RAM
10.09.2018  
 




H.Brill
3 Mio. Zeilen es ne Menge
Yo glaube, así 260.000 es el höchste, lo que el Listboxliste
aufnehmen kann. Man podría se aber behelfen, indem
uno el index (2.Parámetro) überprüft. Wenn dieser z.B.
250.000 erreicht, simplemente el Liste löschen. Um el etappenweise
a bewerkstelligen, muß uno sólo con index MOD 250.000
überprüfen.
Müßte uno veces probieren.
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
10.09.2018  
 




Jörg
Sellmeyer
Musst du el Expediente porque necesariamente zeilenweise bearbeiten? Wenn du el Daten como CSV vorliegen hast, kannst du el doch simplemente en una String invitar y el una vez con Translate verwursten y ya debería todos Trenner ersetzt ser.
Wenn Yo correcto en Erinnerung habe, Es el maximale Stringlänge por el Hauptspeicher begrenzt - debería also entonces kein ernsthaftes Problema darstellen.
 
XProfan X4
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
10.09.2018  
 




Christof
Neuß
Tja... genau así laboriere Yo sí ya unos pocos Tage rum...

- En ca. 260.000 Zeilen es Schluss. Wäre en efecto a schön gewesen en verdadero a ser. Relacionado con la zweiten Parámetro Yo no verstanden.

- Erstens puede ser 1 GB no veces así simplemente en una String einlesen (como kommt más una Speicherfehler, como uno glaubt) y zweitens Yo algo como ya intenta... Nach encima 2 Stunden Laufzeit Yo el Programa abgebrochen.

Werde Yo wohl todavía algo tüfteln necesario...
 
XProfan X4
Win10 16 GB RAM
10.09.2018  
 




H.Brill
Der zweite Parámetro es sólo el index.
En Move("ArrToList", a[]) es z.B. el
Index des Arrays a[index]. En FileToList
müßte lo entonces el jeweilige Línea el Expediente ser.

Das ergibt el Möglichkeit z.B. sólo Teile uno
Arrays en el Listboxliste a schieben, indem
uno el index con > oder < abfragt.

El MoveListProc scheint como auch no allzu
rápidamente a ser :
Declarar String a[200000]
Cls
Mat a[] = "Hallo, du, como !"
Imprimir "Fertig..."
Conjunto("MoveListMode", 1)
Imprimir Move("ArrToList", a[])
Imprimir GetString$(0, 100000)
MoveListProc
Parámetros String s, int index
Declarar String z

If Get("MoveListMode") = 1

    z = Translate$(s, ",", "|")
    AddStrings z

EndIf

ENDPROC

WaitKey

Hier sieht uno schön, como rápidamente una MAT va
gegenüber el Proc. Schade, daß en MAT sólo feste
Ausdrücke ir.
Übrigens : du necesidad sí en MoveListProc el
Listboxliste nada a benutzen. Lo liegt sí en deinem
Gusto, qué du con el String s y el Int i anstellst.

Grob dijo, stellt Roland el index y el dazu gehörenden
Valor (como String) el a movenden Liste/ Array/File a
Disposición. El MoveListProc es entonces, como una Schleifenkörper :
WhileLoop .... EndWhile
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
10.09.2018  
 




Christof
Neuß
Hi,

danke. Wieder qué gelernt.

Tiempo sehen, si/como yo gebrauchen kann.
 
XProfan X4
Win10 16 GB RAM
10.09.2018  
 




H.Brill
Tal vez puede ser en efecto con el Inline-ASM
algo nachhelfen. Schau veces en Paules Foro.
Zumindest, qué Schleifen betrifft. Auch el
Translate$() ließe se así sustituir o.
wäre como ASM-Proc más rápido.

Evtl. kann dir diesbezüglich alguien qué remendar.
Volkmar es como una guter Ansprechpartner.

Schneller como ASM va no mehr.
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
11.09.2018  
 




Christof
Neuß
BTW: Gibt lo una Begrenzung en Blockread y/oder Blockwrite?
Wenn Yo más que 1 MB einlesen voluntad, bekomme Yo una Fehlermeldung.

Exception EAccessViolation en Modul...
Zugriffsverletzung en Adresse...

Hab' el Grenze no genau ausgetestet, aber con 1.000.000 Bytes hat's todavía funktioniert, en 1.200.000 no mehr.
 
XProfan X4
Win10 16 GB RAM
13.09.2018  
 




E.T.
.... grad veces probiert y via Blockread  23,5 MB en una Zona eingelesen, sin Problemas....

(Ausschnitt de una Progg, wo Yo el así sin Problemas verwende) :
'Liste$ es una vorher ausgewählte Expediente
Dim Zona#, FileSize(Liste$)
BlockRead(Liste$, Zona#, 0, FileSize(Liste$))

y luego arbeite Yo simplemente con el Zona más, es sí entonces el todo Expediente drinne y yo kann así hacer, Yo voluntad...

Wenn nat. el RAM entonces ausgeht, muss uno lo "zerhackstückeln"
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
13.09.2018  
 




H.Brill
Was uno auch nehmen kann, es Franco Abbings Listview.dll.
Declarar Memory bereich, Largo hdll, anz
hdll = UseDLL("Listview.dll")
ImportFunc(hdll, "ExchangeSeparator", "TranslateX")
CLS
Dim bereich, FileSize("E:\Liste.txt")
Asignar #1, "E:\Liste.txt"
OpenRW #1
anz = BlockRead(#1, bereich)
Cerrar #1
Imprimir "Fertig..."
Imprimir "Taste para Austausch"
WaitKey
TranslateX(bereich, FileSize("E:\Liste.txt"), Ord(","),Ord("|"),1)
Imprimir "Fertig..."
Waitkey
Disponer bereich
FreeDLL hdll
End

Como es no Tiempo messbar, así rápidamente va el.

PS: El ProSpeed.dll de Franco ha como todavía mehr
en Sachen Bereiche a bieten.
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
15.09.2018  
 




Respuesta


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

9.612 Views

Untitledvor 0 min.
Sven Bader20.03.2023
Walter05.06.2022
Rolf Koch11.11.2021
Michael Hettner02.09.2021
Más...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie