Deutsch
Quelltexte/ Codesnippets

Statische Arrays als Bereich blitzartig speichern und laden: Jonathan's Getrickse

 

p.specht

Die erforderlichen Schritte zum schnellen Abspeichern und Laden von statisch definierten Arrays konstanter Elemente-Länge sind dank @Jonathan´s Trick nun geklärt. Anbei ein erstes Demoprogramm. Achtung: Pfade sind an die jeweiligen Gegebenheiten anzupassen - Verwendung auf eigene Gefahr!!!

Anmerkung: Bei extrem großen Arrays stößt dieses Verfahren wegen des doppelten Speicherplatzbedarfs zur Dimenionierung des Dummy-Bereichs# an Speichergrenzen. Für normale Verhältnisse handelt es sich aber geschwindigkeitsmäßig um einen echten Durchbruch, nicht nur um eine gute Behelfslösung (getestet in XProfan 11 Interpreter und Compiler unter Win7-64 SP1).
WindowTitle "TEIL I: LONG-ARRAY IN EINE BINÄRDATEI SCHREIBEN"
' (D) Demoware "ARRAYS BINÄR SPEICHERN" by P. Specht, Wien, basierend auf dem
' Trick "BEREICHSDIMENSIONIERUNG VOR STARTPOINTERUMLEITUNG" (C)2013-01 by JONATHAN
' siehe dazu: ./../../sys/?nohdr=1&u=www.paules-pc-forum.de/forum/951187-post4.html
Font 2:Randomize:Cls rnd(8^8)
' Testgröße festlegen
var n&=21
Declare Overlay#, Overlay_oldAdress&, A&[n&]
' Mit Testwerten belegen:
A&[] = n& - &Index
'======== JONATHAN's TRICK, Teil 1 v.2 =======
' Quelle: ./../../sys/?nohdr=1&u=www.paules-pc-forum.de/forum/951187-post4.html
' Bereich in Länge Testarray separat anlegen,
Dim Overlay#,@SizeOf(A&[])*4
' Beginn merken,
Overlay_oldAdress& = Overlay#
' dann Startadresse auf Testarray biegen:
Overlay# = @Addr(A&[0])
'=============================================
' Elementzahl und Bereichsgröße anzeigen:
Print @SizeOf(Overlay#)
Print @SizeOf(A&[])
' Testhalber im Array einen Wert ändern:
A&[0]=1234567
' Zeigen, daß dadurch der Bereich geändert wurde:

WhileLoop 0,(@SizeOf(Overlay#)/4)-1

    Print @Long(Overlay#,&loop*4),
    EndWhile :print
    ' Testhalber ein Long in der Bereich schreiben:
    Long Overlay#,(2 +1)*Sizeof(A&[0]) = 4444444
    ' Zeigen, daß dadurch das Array geändert wurde:

    WhileLoop 0,@SizeOf(A&[])-1

        Print A&[&Loop],
        EndWhile :print
        ' Anzeigen der Bereichsgröße, die auf Platte geschrieben wird
        print SizeOf(Overlay#)
        ' Bereich auf Platte schreiben:
        BlockWrite getenv$("USERPROFILE")+"\\desktop\\A&.ary",OverlaY#,0,SizeOf(Overlay#)
        '======== JONATHAN's TRICK, Teil 2 v.2 =======
        ' Bereich auf alte Startadresse setzen ...
        Overlay# = Overlay_oldAdress&
        ' und den dort reservierten Speicherbereich freigeben
        Dispose Overlay#
        '=============================================
        ' Das erste Array löschen
        Clear a&[]
        print "OK"
        WaitInput
        '=============================================
        '                  TEIL II
        '=============================================
        WindowTitle "TEIL II: EINLESEN DES SO GESPEICHERTEN LONG-ARRAYS VON PLATTE"
        ' (D) Demoware 2013-01 "ARRAYS BINÄR EINLESEN" by P. Specht, Wien, basierend auf dem
        ' Trick "BEREICHSDIMENSIONIERUNG VOR STARTPOINTERUMLEITUNG" (C)2013-01 by JONATHAN
        Print
        Print " Einlesen in neues Array b&[] "
        Declare Datei$,LastAddress&,fs&
        Datei$=getenv$("USERPROFILE")+"\\desktop\\"+"A&.ary"
        fs&=FileSize(Datei$)
        Print " Dateiname: ";Datei$
        Print " Filesize = ";fs&
        Declare Bereich#, B&[fs&\4-1]
        '======== JONATHAN's TRICK, Teil 1 v.2 =======
        Dim Bereich#,fs&
        LastAddress&=Bereich#
        ' BEGINN DES AUSREICHEND DIMENSIONIERTEN ARRAYS AUF DAS NEUE ARRAY SETZEN
        Bereich#=addr(b&[0])
        '=============================================
        ' EINLESEN
        @BlockRead(Datei$,Bereich#,0,fs&)
        ' ANZEIGEN
        print fs&
        print @SizeOf(B&[])

        WhileLoop 0,@SizeOf(B&[])-1

            Print B&[&Loop],

        EndWhile

        print
        print
        Print "    ^^^ BITTE VERGLEICHEN MIT ORGINAL ^^^   "
        waitinput
        Print
        Print " Bereich wird nun manipuliert, um Array zu verändern"
        Print " und damit die Überlagerung zu beweisen:        "
        Long Bereich#,0*SizeOf(b&[0]) = n&
        Long Bereich#,3*SizeOf(b&[0]) = n&-3
        print

        WhileLoop 0,@SizeOf(B&[])-1

            Print B&[&Loop],
            EndWhile :print
            '======== JONATHAN's TRICK, Teil 2 v.2 =======
            ' Überlagerung aufheben:
            Bereich#=LastAddress&
            dispose Bereich#
            '=============================================
            clear B&[]
            Print
            Print " Danke! "
            print
            print " Testdatei löschen? J/N ";
            var jn$=""
            input jn$

            if left$(upper$(jn$),1)="J"

                Assign #4,Datei$
                ERASE #4
                beep
                print
                print " "+Datei$+" gelöscht."

            endif

            Print
            print " Man sieht sich! "
            WaitInput 10000
            END
 
XProfan 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
08.05.2021  
 




p.specht

Benchmark für eine Long-Matrix A&[ 1024 , 1024 ] ~ 41.943.040 Byte (40 MB):
- Declare: 94 ms
- Elemente auf &index setzen: 65,1 Sek.
- Matrix linear auf Platte schreiben: 390 ms
- Einlesen von Platte in ein anderes Array: 31 ms
- Die Arrays vergleichen: 139 Sek.
 
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
08.05.2021  
 



Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

681 Betrachtungen

Unbenanntvor 0 min.
Ernst21.07.2021
Uwe ''Pascal'' Niemeier13.06.2021
R.Schneider28.05.2021
Michael W.28.05.2021
Mehr...

Themeninformationen

Dieses Thema hat 1 Teilnehmer:

p.specht (2x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie