Ein großes Zahlenarray möglichst schnell als Datei speichern und wieder einlesen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Ein großes Zahlenarray möglichst schnell als Datei speichern und wieder einlesen

    Guten Morgen zusammen,

    Ich habe wieder einmal ein Grundlagenproblem: Ich habe ein sehr großes Array mit integer Zahlen A(300,300,500), das ich nun möglichst schnell als Datei speichern möchte. Mit:

    fileopen("d:\file.out",openmode.output)
    for n=1 to 500
    for i=1 to 300
    for j=1 to 300
    lineprint(2,a(i,j,n))
    next j
    next i
    next n
    fileclose(2)

    geht das auch, ist aber quälend langsam (einige Minuten!). Gibt es da eine bessere Methode, die sozusagen das ganze Array dieser Größe in Sekundenschnelle und in einem Rutsch auf die Festplatte bringt und auch wieder von dieser einliest :?: ^^

    Mit herzlichen Grüßen

    Johannes
    Pack dieses Array in eine separate Klasse und serialisiere sie.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Serialisieren habe ich auch schon probiert. Geht auch, dauert aber in meinem Fall fast gleich lange. Ich denke mir aber, dass es irgendwie wesentlich schneller gehen muss als bei mir, denn wie könnten sonst große Bilddateien und/oder Videos so schnell von Festplatte gelesen und auf diese gespeichert werden?
    Bilddaten werden als ByteArray gelesen, das geht ganz fix, da das praktisch ein elementarer Systemruf ist.
    Du hast Integers in 3 Dimensionen, da hat das System doch etwas mehr zu tun.
    Probier mal, das Array in einen MemoryStream zu schreiben und danach den MemoryStream in einem BinaryStream oder so auf Platte zu bringen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    schreib das zeug direkt in einen FileStream, probier zunächstmal mittm BinaryWriter.
    Aber auch bleiben noch einige Möglichkeiten zu optimieren.

    vlt. gugge Stream-Konzepte (aber ist glaub schon ziemlich weit führend. Annererseits sollteman die Stream-Konzepte schon so leidlich vollständig kennen)

    Übrigens würde ich ein JaggedArray empfehlen statt eines mehrdimensionalen. Ist etwas schwieriger aufzubauen (jedes InnerArray muß dimensioniert werden), aber wesentlich freundlicher zum Arbeitsspeicher, und grad Kopier-Vorgänge sind einfacher programmiert. gugge vlt. Mehrdimensionalität - "unechte Mehrdimensionalität"

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Danke Euch!

    Hallo RodfromGermany und ErfinderdesRades,

    Vielen Dank für Eure äußerst nützlichen Tipps bezüglich schneller Speicherung von dreidimensionalen großen Arrays.

    Ich habe eine Kombination aller Eurer Anregungen verwendet.

    Erstmal wird das Riesenarray mit short-Zahlen namens film(300,300,N) zeile für zeile in ein eindimensionales array namens Store(300^2*N) geschrieben. Also das Problem quasieindimensional gemacht.

    dim pixel as integer = 300
    dim iz as integer=0
    dim nmax as integer=500
    dim storr(pixel^2*nmax)

    for n=1 to nmax
    for i=1 to pixel
    for j=1 to pixel
    iz+=1
    stor(iz)=film(i,j,n)
    next j
    next i
    next n

    Danach wird dieses Feld serialisiert und in einen Stream geschrieben. Hiezu verwende ich eine komplette, sehr praktische und einfach zu bedienende Routine, die ich in Google aufgetan habe:

    vbarchiv.net/tipps/tipp_2042.html

    Angewandt auf 1D arrays arbeitet diese Routine superschnell!

    Noch kurz zum Hintergrund: Ich arbeite mit Fraktalen und habe ein Programm in VB2010 geschrieben, das hintereinander berechnete Fraktalbilder zu einem Film zusammenfasst. Meine Einzelbilder sind dabei 300 mal 300 Pixel groß und der Film kann bis zu 500 Bilder besitzen. Dazu müssen dann also 90000 * 500 = 45 000 000 Short numbers schnell auf Festplatte gespeichert werden.

    Dank Eurer Hilfe habe ich nun ein sehr effizientes Tool zum Studium von beliebigen 2D Fraktalen zur Hand :!: :) :!: :thumbsup:

    Grüße

    Johannes
    Hat es Zweck, die Bilder in eine Animated Gif zu packen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!