Gelöst - Maximale Dateigröße (wurde doch nicht erreicht)

Für allgemeine Fragen zur Programmierung mit PureBasic.
_v4
Beiträge: 26
Registriert: 16.11.2012 13:36

Gelöst - Maximale Dateigröße (wurde doch nicht erreicht)

Beitrag von _v4 »

Hallo, hatte ein kleines Programm gebastelt, das ein Script ersetzen soll, aus einer ASCII-Datei mit dem Aufbau:

Code: Alles auswählen

 Zahl1 Zahl2 Zahl3
Zahl3 ausliest und diese mit einem Faktor faktorisiert. Die Daten können u.U. bis in den GB-Bereich Größe haben.

Nun zum Problem: PB Bricht beim Lesen der alten Datei (mit Ausgangswerten) oder Schreiben der neuen Datei (mit berechneten Werten) bei 440MB ab.
Woran könnte das liegen?

Verwendetes PB v. 5.00 (Windows 7 - x86-64)

Hier noch der Quellcode:

Code: Alles auswählen

; Console Öffnen
OpenConsole()

; Dateinamen für Eingabedatei abfragen
Print("# Bitte Dateinamen mit Endung Eingeben: ")
dateiname$ = Input()

; Z-Faktor für spätere Multiplikation mit Z-Wert (aus Datei) abfragen
Print("# Den z-Faktor Eingeben - Dezimaltrennzeichen ist der (.): ");
zfaktor.d = ValD(Input())

; Startzeit berechnen
startzeit$ = FormatDate("%hh:%ii Uhr am %dd.%mm.%yy", Date())


; Wertebereich von Z-Faktor Prüfen
If ( (zfaktor.d < 10) And (zfaktor.d > 0.5))
  
    ; Startzeit ausgeben
    PrintN("# Startzeitpunkt: " + startzeit$)
    
    ; DateiOutputName Definieren (für berechnete Werte)
    dateiname_out$ = "OUT_" + StrD(zfaktor.d,1) + "_" + dateiname$
    
    ; Dateien öffnen bzw. wenn nicht vorhanden anlegen
    If (FileSize(dateiname$) <> -1)
      
      OpenFile(0, dateiname$)
      
      If OpenFile(1, dateiname_out$) 
        
          ; Bis Dateiende erreicht ist zeilenweise lesen
          While(Not Eof(0)<>0)
            
            ; Zeile einlesen
            a$ = ReadString(0)
            
            Xwert$ = StringField(a$,2," ")
            Ywert$ = StringField(a$,4," ")
            Zwert$ = StringField(a$,6," ")
            
            ; Gelesenen String als Zahl zum Rechnen umwandeln
            z.d = ValD(Zwert$)
            Zout$ = StrD(z.d*zfaktor.d, 1)
            
            ; Ausgabe zeilenweise in Datei
            OutZeile$ = " " +Xwert$ + "  " + Ywert$ + "  " + Zout$
            WriteStringN(1, OutZeile$)
           
          Wend
          
          ; Nach dem alles fertig ist Dateien schließen
          CloseFile(1)
          CloseFile(0)
          
          ; Endzeit berechnen & ausgeben, sowie Erfolgsmeldung
          endzeit$ = FormatDate("%hh:%ii Uhr am %dd.%mm.%yy", Date())
          PrintN("# Endzeitpunkt  : " + endzeit$)
          PrintN("")
          PrintN("# Alle Berechnungen sind abgeschlossen!")
          PrintN("")
          PrintN("# [ENTER] um Programm zu beenden!")
        EndIf
        
    Else
          PrintN("Fehler beim oeffnen der Datei!")
    EndIf
    
  Else
    PrintN("Z-Faktor zwischen 0.5 und 10 angeben!")
  EndIf
    

Input()
CloseConsole()
Danke schonmal im Voraus für die Hilfe!
Zuletzt geändert von _v4 am 03.12.2012 20:42, insgesamt 2-mal geändert.
_v4
Beiträge: 26
Registriert: 16.11.2012 13:36

Re: Maximale Dateigröße beim Lesen/Schreiben erreicht?!

Beitrag von _v4 »

Hatte ja in der Hilfe gelesen, das 2^64 Bit möglich sind und kontroverser Weise wird z.B. hier: http://www.purebasic.com/german/documen ... story.html erwähnt, das große Dateien [...] bei der 'File' Library auf Linux/OSX [...] unterstützt werden, hier steht aber nichts von Windows.

Aber mehr als 440 MB sollten mit Win schon möglich sein, oder? Muss doch an nem Fehler meinerseits liegen? :bluescreen:
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Maximale Dateigröße beim Lesen/Schreiben erreicht?!

Beitrag von STARGÅTE »

Also mit PB hat der Fehler nichts zu tun, PB kann locker GB-Große Dateien lesen und Schreiben:

Code: Alles auswählen

*Buffer = AllocateMemory(1024*1024*100)
RandomData(*Buffer, MemorySize(*Buffer))

If CreateFile(1, GetTemporaryDirectory()+"BigFile.bin")
	For N = 1 To 50
		WriteData(1, *Buffer, MemorySize(*Buffer))
		Debug Str(Loc(1)/1024/1024)+" MB"
	Next
	CloseFile(1)
EndIf
Der Code wird normal ausgeführt und erstellt eine 5GB große Datei

was heißt denn in deinem Fall "bricht ab"?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
_v4
Beiträge: 26
Registriert: 16.11.2012 13:36

Re: Maximale Dateigröße beim Lesen/Schreiben erreicht?!

Beitrag von _v4 »

Ok. Dankeschön. Hab nun größere Testdaten bekommen mit denen es geht.

Kann es daran liegen das ein EOF bereits vor dem eigentlichen Dateiende kam?
(Da die Dateigröße z.T. unterschiedlich ist, aber immer die gleiche Anzahl von Stellen im Dokument pro Zeile sind)
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: Maximale Dateigröße beim Lesen/Schreiben erreicht?!

Beitrag von WPö »

Servus, V4!

Erstmal ein Willkommen von mir im Forum!
_v4 hat geschrieben:OpenFile(0, dateiname$)
Sollte das nicht ReadFile sein?

Prüfe auch, ob ein ganz profaner Dateisystemfehler vorliegt, weshalb bei 440MB Schluß sein soll: Partition voll.

Gruß - WPö
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
_v4
Beiträge: 26
Registriert: 16.11.2012 13:36

Re: Maximale Dateigröße beim Lesen/Schreiben erreicht?!

Beitrag von _v4 »

Da ich nur einen sehr kleinen Bestand an Testdaten hatte und bei ner kleinen Datei die Dateigröße identisch war u. bei sehr großen Daten mehrere MB unterschied waren, dachte ich, dass das trotz der gleichen Zeichenzahl einen Fehler in der Datei hatte. Egal.

Auf jeden Fall ist von der PureBasic-Seite her alles Okay und die Dateigröße scheint auch keine Rolle zu spielen. Ist also alles in Allem so wie es in der Hilfe beschrieben ist und funktioniert bestens.

Danke an alle Beteiligten für die Hilfe!
Antworten