Menge erforderlicher Daten macht Programmierung unmöglich

Anfängerfragen zum Programmieren mit PureBasic.
Heinz Mendax
Beiträge: 50
Registriert: 29.03.2013 12:25
Wohnort: Eisenach

Menge erforderlicher Daten macht Programmierung unmöglich

Beitrag von Heinz Mendax »

Hallo !
Ich benötige für ein Programm bestimmte berechnete Werte aller 16 Mio RGB-Farben - für jede Farbe 6 Werte.
Ich habe diese Werte mit einem PB-Programm berechnet und in eine Datei "daten.pb" als Data-Zeilen
geschrieben. Diese Datei ist 1Gb groß und es dauert einen gefühlten Tag, bis sie geladen ist. Ich wollte
die "daten.pb" dann durch den eigentlichen Programmcode vervollständigen. Ich schätze mit der
Datamethode geht es (praktisch) nicht. Welche anderen Wege gibt es, diese gewaltige Datenmenge in
ein Programm einzubinden, daß dann aber auch noch läuft.

Heinz
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Menge erforderlicher Daten macht Programmierung unmöglic

Beitrag von RSBasic »

Wofür brauchst du die vorberechneten RGB-Werte? Kann man diese nicht während der Laufzeit berechnen?
Wie sehen die Werte aus? Was ist das Ziel dieser Daten? Was möchtest du genau machen?

Bezüglich des Ladens: Wenn du eine große Datei zeilenweise (ReadStringN()) einliest, dann ist das kein Wunder, dass es ewig dauert. Viel schneller ist es, wenn du die Datei mit ReadData() lädst.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Menge erforderlicher Daten macht Programmierung unmöglic

Beitrag von STARGÅTE »

Unabhängig davon, was du vorhast hier ein Lösungsweg:

Speichere deine 6 Werte zu jeder Farbe in eine "normale" binäre Datei zB kannst du ja mit PureBasic und WriteLong() oder WriteWord() oder WriteFloat() (keine Ahnung was du brauchst) die Daten hintereinander weg in die Datei schreiben.
Da diese 6 Werte ja immer die gleiche Länge haben werden, kannst du dann aus deinem Programm heraus sehr schnell auf diese Gigabyte-Datei mittels FileSeek() auf die entsprechende Stelle springen, sozusagen streamen.
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
Heinz Mendax
Beiträge: 50
Registriert: 29.03.2013 12:25
Wohnort: Eisenach

Re: Menge erforderlicher Daten macht Programmierung unmöglic

Beitrag von Heinz Mendax »

Hallo,
Die 6 Werte pro die 16 Mio Farben werden zu Rechnungen im Lab-Farbraum benötigt. Natürlich könnte man diese
auch während der Laufzeit berechnen. Man benötigt aber auch dann einige Mio Variablen bzw. Arrays. Auch würde
das Programm eine Weile vor sich hinarbeiten (Laden der Daten) ehe es mit der eigenlichen Anwendung weitergeht. Das
Problem mit den Data-Zeilen ist, daß das Programm,das diese enthält, unendlich lang benötigt, bis der Text im
Editor (GUI) geladen ist und man Code eingeben kann. Ich weiss ja nicht, wie es wäre, wenn das Programm mit
den Datazeilen compiliert bzw. eine Exe wäre.

Data.f 230443,12.443432,-112.344432,0.3444324,-67.004556,-3.785545,-54.225467

230443 ist die Farbe RGB()

Ich brauche die Daten nicht nur für eine bestimmte Farbe, sondern müssen zum
Vergleich alle zur Verfügung stehen.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Menge erforderlicher Daten macht Programmierung unmöglic

Beitrag von udg »

Lade das als include in dein Programm. Wenn du diese als Data in die Editor gui mit lädtst, dann wartest du eeeewig bis du mal einen klick machen kannst, geschweige denn code schreiben. Und beim nächsten scrollen wartest du wieder.
Keine gute Idee
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Menge erforderlicher Daten macht Programmierung unmöglic

Beitrag von hjbremer »

Versuch es doch mal mit einem virtuellem Listicongadget

es gibt ein Beispiel von mir http://purebasic.fr/german/viewtopic.ph ... ew#p300345

Es funktioniert aber nur mit einer alten Pb Version korrekt und nur unter Windows. Es zeigt aber wie man es benutzt.
Der Zugriff auf die Daten für den Vergleich etc, funktioniert aber nur mit Api Befehlen siehe 2.Beispiel. Ansonsten steht alles wichtige im Code

Den Code umzuschreiben auf neuere Versionen dafür habe ich aber keine Zeit und Lust

__________________________________________________
Link angepasst
09.04.2016
RSBasic
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Burstnibbler
Beiträge: 58
Registriert: 04.10.2008 12:10

Re: Menge erforderlicher Daten macht Programmierung unmöglic

Beitrag von Burstnibbler »

Heinz Mendax hat geschrieben:Ich brauche die Daten nicht nur für eine bestimmte Farbe, sondern müssen zum
Vergleich alle zur Verfügung stehen.
Datenbank?
Benutzeravatar
grapy
Beiträge: 108
Registriert: 09.09.2004 09:05

Re: Menge erforderlicher Daten macht Programmierung unmöglic

Beitrag von grapy »

Naja, es sollte ja wirklich kein Problem sein die Daten in eine Datei zu schreiben und wieder auszulesen.
Eine Datenbank macht auch nichts anderes. :mrgreen:
Und sofern Du genug RAM hast, einmal alles da rein dann flutscht das.
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Menge erforderlicher Daten macht Programmierung unmöglic

Beitrag von Sicro »

Bei diesem Code gibt es ein Fehler vom Assembler:

Code: Alles auswählen

DataSection
  IncludeBinary "BigFile.dat" ; 1,3 GB Datei
EndDataSection
Hier ist wohl die Grenze einer DataSection erreicht.

Durch einen anderen Weg ist es jedoch möglich, eine solch riesige Datei an die Programmdatei anzuhängen und vom Programm später auslesen zu lassen:

Das eigentliche Programm, das die inkludierte Datei enthalten und auslesen soll:

Code: Alles auswählen

Define.s FileData
Define   *IncludedDataSize, *StartPosOfIncludedData

If ReadFile(0, ProgramFilename())
  
  ; Datei-Zeiger an das Datei-Ende vor dem Long-Wert mit der Daten-Größe setzen
  FileSeek(0, Lof(0) - SizeOf(LONG))
  
  *IncludedDataSize = ReadLong(0)
  
  ; Zum Anfang des Long-Werts zurück
  FileSeek(0, -SizeOf(LONG), #PB_Relative)
  
  ; und weiter zum Anfang der inkludierten Daten zurück
  FileSeek(0, -*IncludedDataSize, #PB_Relative)
  *StartPosOfIncludedData = Loc(0)
  
  ; 3 Ascii-Zeichen von den inkludierten Daten lesen
  FileData = ReadString(0, #PB_Ascii, 3)
  
  ; Nochmal an den Anfang der inkludierten Daten
  FileSeek(0, *StartPosOfIncludedData)
  
  ; 2 Bytes von den inkludierten Daten lesen und als Hex-Werte ausgeben
  FileData + #CRLF$ + Hex(ReadByte(0), #PB_Byte) + Hex(ReadByte(0), #PB_Byte)
  
  CloseFile(0)
EndIf
  
MessageRequester("Info", FileData)
Hilfsprogramm, um an Programmdateien Dateien anzuhängen:

Code: Alles auswählen

Define.s EXE_File.s = OpenFileRequester("EXE-Datei öffnen", "", "", 0)
If Not (FileSize(EXE_File) > 0 And OpenFile(0, EXE_File, #PB_File_Append))
  Debug "EXE-Datei ist leer oder Fehler!"
  End
EndIf

Define.s FileToAdd.s = OpenFileRequester("Datei hinzufügen", "", "", 0)
If Not (FileSize(FileToAdd) > 0 And ReadFile(1, FileToAdd))
  Debug "Hinzufügende Datei ist leer oder Fehler!"
  Goto CleanUp
EndIf

; 10 MegaByte großer Buffer allozieren 
Define *Buffer = AllocateMemory(1024*1024*10, #PB_Memory_NoClear)
If *Buffer = 0
  Debug "Speicher konnte nicht reserviert werden!"
  Goto CleanUp
EndIf

; Zu inkludierende Datei schrittweise an die EXE-Datei anhängen
Define.i DataSize
Repeat
  DataSize = ReadData(1, *Buffer, MemorySize(*Buffer))
  If DataSize > 0
    WriteData(0, *Buffer, DataSize)
  EndIf
Until DataSize = 0

; Länge der Daten als Long-Wert schreiben
WriteLong(0, Lof(1))

MessageRequester("Fertig", "Die Datei wurde inkludiert!")

CleanUp:
CloseFile(#PB_All)
If *Buffer : FreeMemory(*Buffer) : EndIf
Um das Beispiel auszuführen, muss der Code des eigentlichen Programms zu einer EXE kompiliert werden. Anschließend wird das Hilfsprogramm gestartet, mit diesem die gerade kompilierte EXE geöffnet und die zu inkludierende Datei ausgewählt wird. Nach einem kurzen Moment erscheint die Nachricht, dass das Programm fertig ist. Starte nun das eigentliche Programme, das nun die inkludierte Datei enthält.

Bei dieser Vorgehensweise wird beim Programmstart nicht die komplette EXE-Datei mit der Gigabyte großen inkludierten Datei in den Arbeitsspeicher geladen. Geprüft habe ich es unter Windows XP und Linux.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Menge erforderlicher Daten macht Programmierung unmöglic

Beitrag von NicTheQuick »

Um Vergleiche irgendwelcher Werte zueinander anzustellen, ist eine Datenbank mit ordentlichen Indizes und Keys am simpelsten zu handhaben. Vielleicht reicht da schon SQLite für.
Aber eine Datasection für über 1 GB Daten zu missbrauchen, ist Unfug. Eine externe Datei an die EXE anzuhängen gewinnt auch keine Preise, aber ist besser als die Datasection-Version.

Wenn man jetzt wüsste, was du mit den Daten genau machen willst, könnten wir dir vorschlagen, was das beste Vorgehen wäre.
Antworten