Seite 1 von 3

Wo liegt denn jetzt die max. Größe bei FReadStr() ? [ERLEDIG

Verfasst: Di, 15. Feb 2011 18:04
von Manfred
Hi,

das hier:

Code: Alles auswählen

cBuffer        := FReadStr(nHandle,FSize(nHandle))
erzeugt das hier:

Code: Alles auswählen

FATAL ERROR LOG 
System-Error
SYS Thread-ID: 1052 
Module: MOM
Error Codes: EH: 4 Sub: 87(57) OS: 87 XPP: 40
Call Stack of Thread 1 (452):
@DC_GETLIST@I@EVENTLOOP(3847)
@DC_GETLIST@I@READGUI(3591)
DC_READGUI(95)
PHNARTULDKONVERT(114)
(B)main(130)
@DC_GETLIST@I@EVENTLOOP(4296)
@DC_GETLIST@I@READGUI(3591)
DC_READGUI(95)
MAIN(183)
Call Stack of GUI Thread (640):
Call Stack of Thread 3 (1052):
ARTULDKONVERT(146)
File: y:\video9\programm\shdstammdaten10.exe
TimeStamp: 20110215 17:44
End of FATAL ERROR LOG.
die Textdatei hat eine Größe von 2.013.982.108 Bytes. Max Größe überschritten?

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 18:14
von Martin Altmann
Hmm,
was für ein Filesystem hast Du denn? FAT16? FAT32? NTFS?
Maximale Dateigröße 2GB bzw. 4GB?

Viele Grüße,
Martin

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 18:17
von Manfred
Uff, da sagst Du was

da muß ich mal eben basteln. Das liegt auf einem Samba Server und der arbeitet unter EXT4. bzw. auf einem virtuellen Server. Das werde ich mal eben lokal ausprobieren auf NTFS.

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 18:22
von Manfred
Macht auf einem lokalen LW unter Win XP und NTFS den gleichen Fehler.

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 18:26
von Martin Altmann
Hm - OK.
Und warum willst Du alles in einem Rutsch lesen? Warum nicht häppchenweise in 4 KB-Blöcken (oder was auch immer)?
Steht an der Stelle, an der er abbricht, vielleicht ein chr(0)?

Viele Grüße,
Martin

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 18:32
von Manfred
Sagen wir mal so,

das Thema hatten wir hier schon und dann kam halt diese Lösung dabei heraus.

Code: Alles auswählen

          IF ! lAbbruch
             oThread:nZaehler := 2                                              // weil Überschrift überspringen wird
             oPhnUpdate:db_oeffnen(,.F.,.T.,,.T.,,.T.)
             nHandle := FOpen(oSysPara:cProgrammPfad + "\download\phononet\artuld.txt",FO_READ)
             cBuffer        := FReadStr(nHandle,FSize(nHandle))
             oThread:nMenge := NumAt(Chr(10),cBuffer)
             nStelleLF      := AtNum(Chr(10),cBuffer,3,nStelleLF) + 1           // Überschrift übergehen
             DO WHILE .T.
                Sleep(0)
                oThread:nZaehler++
                IF oThread:nZaehler = oThread:nMenge
                   EXIT
                ENDIF
                IF ! oThread:lGestartet
                   IF oSysPara:oMessage:anzeigen("Konvertierung abbrechen?",.T.,"N")
                      EXIT
                   ENDIF
                   oThread:lGestartet := .T.
                ENDIF
                nLaenge := AtNum(Chr(10),cBuffer,1,nStelleLF) - nStelleLF          // berechnen, wie lang der Auszu sein muss
                cAuszug := SubStr(cBuffer,nStelleLF,nLaenge)
                aArray  := Str2Array(cAuszug)
                (oPhnUpdate:nArea)->(DbAppend())
                (oPhnUpdate:nArea)->v_titel    := aArray[10]
                (oPhnUpdate:nArea)->v_titel2   := Upper(aArray[10])
                (oPhnUpdate:nArea)->v_darstell := aArray[11]
                (oPhnUpdate:nArea)->v_fsk      := Val(aArray[45])
                (oPhnUpdate:nArea)->v_bestnr   := aArray[6]
                (oPhnUpdate:nArea)->fst1ekdat  := SToD(aArray[35])
                (oPhnUpdate:nArea)->aenderdat  := SToD(aArray[37])
                (oPhnUpdate:nArea)->streichdat := SToD(aArray[36])
                (oPhnUpdate:nArea)->ean_neu    := aArray[56]
                nStelleLF := AtNum(Chr(10),cBuffer,1,nStelleLF) + 1
             ENDDO
             oThread:lGestartet := .F.
             FClose(nHandle)
             oPhnUpdate:schliesse_Datenbank()
          ENDIF
          oPbStart:setCaption("Start")
          oPbEnde:enable()
          RETURN
********************************************************************************
FUNCTION  Str2Array(cString, cDelim )
          LOCAL aRet := {}
          LOCAL nX   := 1
          LOCAL nPos := 0
          LOCAL nLen
          LOCAL cRet

          DEFAULT cDelim TO ";"

          nLen := LEN( cString )
          cRet := SPACE(nLen)

          DO WHILE ( .T. )
             nPos := AT(cDelim, cString, nX)
             IF nPos > 0
                cRet    := SubStr(cString, nX, nPos-nX)
                AADD(aRet, cRet)
                nX    := ++nPos
             ELSEIF nX <= nLen
                cRet    := SubStr(cString, nX)
                aadd(aRet, cRet)
                exit
             ELSEIF nX > nLen
                aadd(aRet, "")
                exit
             ELSE
                exit
             ENDIF
          ENDDO
          RETURN ( aRet )

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 18:49
von Tom
Mmh. STACK der Anwendung hochsetzen? 2 GB in einem Speicherblock - geht das überhaupt? Müsste man mal ausprobieren, indem man in einer Schleife einen 2 GB langen String konkatiniert.

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 18:53
von Manfred
Deswegen habe ich ja gefragt. Aber ich habe jetzt mit kleineren Dateien auch einen Futtsack. Vielleicht ist das ja doch Murks drin.

Das wird wieder eine lange Nacht. :angry5:

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 19:04
von Martin Altmann
Moin,
wie geschrieben - bei chr(0) ist Ende! Zumindest bei FReadStr() - Fread() geht!

Viele Grüße,
Martin

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 19:08
von Manfred
Ende mit xppFatal.log?

Aber wie schon erwähnt, ich habe gerade eine kleinere probiert und die liefert einen Leerstring. Jetzt geht die Sucherei wieder los.

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 19:24
von Jan
Manfred hat geschrieben:Ende mit xppFatal.log?
Nein, Ende mit einlesen. Da ist der String dann zu Ende. Da Chr(0) erreicht.
Manfred hat geschrieben:Aber wie schon erwähnt, ich habe gerade eine kleinere probiert und die liefert einen Leerstring. Jetzt geht die Sucherei wieder los.
Leerstring ist Lesefehler oder Dateiende. Lesefehler? Warum sollte der bei einer kleineren Datei auftreten? :?: Wie groß ist denn "kleinere Dateien"?

Jan

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 20:30
von Martin Altmann
Manfred,
was spricht denn dagegen, es mit FRead() häppchenweise zu probieren?

Viele Grüße,
Martin

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 20:41
von Manfred
Hi Martin,

das habe ich schon hinter mir. So habe ich es am Anfang gemacht.

http://www.xbaseforum.de/viewtopic.php?f=32&t=4267

hier haben wir über das derzeitige System diskutiert.

Egal was ich nehme, es tauchen immer wieder neue Probleme auf. Erst habe ich es Schritt für Schritt gemacht, da war es ein Kampf mit der Unterteilerei. Dann habe ich es über die DelDbE gemacht da platzte der Rechner, weil er dicke Backen kriegte. Dann kam dieser Vorschlag und der hat irgendwie andere Mucken. Ich vermute einmal, da steht irgendwo Mist drin. Leider ist die Textdatei so groß, das sie mit keinem mir zur Verfügung stehenden Editor komplett zu öffnen geht um mal nachzusehen, wo das evtl. Mist steht.

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 20:44
von Martin Altmann
Thema Editor: Nimm mal Textpad.

Viele Grüße,
Martin

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 21:02
von Manfred
Muß ich morgen nochmal testen. Der Editor öffnet die nicht. Angeblich Datenträger voll. Ich vermute da ist irgendwo was schrottiges drin. Morgen werde ich mal Zwischengrößen erzeugen und dann mal sehen, aber wann das losgeht.

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 21:07
von Martin Altmann
:?:
Wie viel Platz ist auf Deiner Festplatte frei?
Und wie viel auf der Partition, auf der Deine Auslagerungsdatei liegt? Und wie hast Du die Auslagerungsdatei konfiguriert?

Viele Grüße,
Martin

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 21:52
von Herbert
So, noch den Schweizer Käse dazu :razz:
@Martin: FreadStr liest per Definition bis zum ersten Chr(0). also sicher keine Fehler, höchstens zuwenig eingelesen. Bin aber deiner Meinung betreffend Aufteilen, weil:

@Manfred: gemäss deinem "was dabei herauskam" nimmst du den Inhalt ausenander und legst nach bestimmten Regeln den Inhalt in eine Datenbank ab.
Da sehe ich wirklich nicht ein, warum du den ganzen Haufen sofort einlesen willst. Ist die Datei mal offen, dann wirst du innerhalb eines Loops mit mehrmaligem Lesen (z.B. von crlf zu crlf mit FSeek(...,FS_RELATIVE) nicht wirklich Performance einbüssen, da das dbAppend wohl die meiste Zeit aufwendet, was du so oder so brauchst.

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 22:20
von Rolf Ramacher
Hi Manfred,

versuch es doch mal mit memoread()

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Di, 15. Feb 2011 22:36
von Martin Altmann
Herbert,
Herbert hat geschrieben:@Martin: FreadStr liest per Definition bis zum ersten Chr(0). also sicher keine Fehler, höchstens zuwenig eingelesen.
habe ich auch nicht behauptet, dass es ein Fehler sei. Sorry, wenn es so rüberkam. Steht so in der Hilfe - bei chr( 0 ) ist Ende mit Einlesen (das meinte ich nicht als Abbruch, sondern finis).

Viele Grüße,
Martin

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Mi, 16. Feb 2011 2:45
von brandelh
Hi,

wenn ich das richtig gelesen habe, will Manfred einen 2 GByte großen String einlesen !
Dazu kommen eventuell noch internes umkopieren und man ist ruki zuki über der maximalen
Speicheradressierbarkeit einer 32 Bit EXE (auch mit 100 GB Ram auf einem X2 64 Bit Win7 ;-)

Wenn wir so eine DBF machen dürften, wäre das ja schon ganz nett ;-)

Martin hat schon Recht, schaufle 4 KB Blocks in den Speicher und von dort weiter auf die Platte.

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Mi, 16. Feb 2011 14:58
von Herbert
Oh, die Grösse hatte ich übersehen... Manfred nennt dies so zierlich "Textdatei".

Ist da nur Text drin?
Wieso wird diese Datei so gross?
Kannst du nicht was vorgängig extrahieren?
Schreibst du alles in eine einzelne .DBF rein?

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Mi, 16. Feb 2011 15:13
von Manfred
Herbert hat geschrieben:Oh, die Grösse hatte ich übersehen... Manfred nennt dies so zierlich "Textdatei".

Ist da nur Text drin?
Wieso wird diese Datei so gross?
Kannst du nicht was vorgängig extrahieren?
Schreibst du alles in eine einzelne .DBF rein?
Ja, da ist nur Text drin.

Weil soviele Daten anfallen

Nein, die Datei bekomme ich so geliefert, an einem Stück.

Die wird konvertiert und ergibt ca. 900.000 Sätze

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Mi, 16. Feb 2011 15:20
von Tom
FReadStr() wird 2 GB nicht beherrschen, da bin ich ziemlich sicher, und außerdem stoppt es eben, wie hier mehrfach angemerkt wurde, bei Chr(0). Wenn Du die Datei mal mit einem Hexeditor öffnest (z.B. Hex-Editor MX, Freeware), wirst Du wahrscheinlich 0-Character finden.

FileStr() aus den Tools liest bis zum Ende. Aber auch das wird nicht funktionieren, weil die entstehende, zusammenhängende Datenmenge im Arbeitsspeicher zu groß ist. Deshalb würde ich empfehlen, mit den Low-Level-Funktionen (FOpen(), FRead() - nicht FReadStr(), denn auch das stoppt bei Zero-Zeichen!) zu arbeiten und tranchenweise einzulesen. Das geht bei jeder beliebigen Dateigröße und schmiert auch nicht ab, wenn ASCII 0 vorgefunden wird.

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Mi, 16. Feb 2011 15:22
von AUGE_OHR
Manfred hat geschrieben:Weil soviele Daten anfallen

Nein, die Datei bekomme ich so geliefert, an einem Stück.
kannst du die nicht gleich als DBF oder Excel Tabelle bekommen ... ?

Re: Wo liegt denn jetzt die max. Größe bei FReadStr() ?

Verfasst: Mi, 16. Feb 2011 15:23
von Manfred
Ich denke auch, dass es dahin gehen wird. Aber trotzdem ist die Datei ab einer gewissen Größe wohl im Eimer.