Hallo Martin,
Kann mir jemand sagen, warum DumpSave manchmal extrem langsam ist? Ich
habe ein multi-dimensionales Zahlenarray (27x12x72x144 reelle Zahlen)
berechnet, welches ich binär abspeichern möchte. DumpSave benötigt
über 500 Sekunden, während Export["Zahlen.bin64",array,"Real64"] dies
in weniger als einer Sekunde schafft.
In dieser Allgemeinheit leider nein:
In[13]:= a =
Table[Sin[i/27.] Cos[j/12.] Csc[k/72.] Sec[l/144.], {i, 27}, {j,
12}, {k, 72}, {l, 144}];
In[3]:= Dimensions[a]
Out[3]= {27, 12, 72, 144}
In[4]:= SetDirectory[NotebookDirectory[] <> "\\test"]
Out[4]= "C:\\Udo\\Abt_N\\test"
In[20]:= Timing[DumpSave["heimannArray.mx", a];]
Out[20]= {0.562, Null}
Die Zeiten sind konstant unter einer Sekunde ((min 0.562, max. 0.989
Sekunden), die Festplatte ist nicht in einem Netzwerk, front end und
kernel laufen auf demselben Prozessor. Der Rechner hat 2.53 GHz
Taktfrequenz und 512 MB Memory. Es entsteht eine Datei von 26'245 kB
Grösse.
Merkwürdig ist allerdings, dass wenn ich das mit Export
rausgeschriebene Array wieder binär importiere und einer neuen
Variablen zuordne, dass ich diese dann mit DumpSave sehr schnell
speichern kann. Dabei sind die binär eingelesenen Zahlen identisch mit
den Zahlen im primären Array.
DumpSave writes out definitions in a binary format that is optimized for
input by Mathematica, sagt die Hilfe. Der experimentelle Befund der
Beschleunigung von DumpSave[] nach Umbenennung des array kann darauf
hindeuten, dass vor der Umbenennung zu dem Array gehörige Definitionen
mitgeschrieben werden. Um dem weiter nachzugehen, müssten mehr als eine
umgangssprachliche Problemdarstellung kundgetan werden.
Möglich ist auch, dass der verwendete Arrayname noch anderswo in geladenen
Packages und/oder geöffneten Notebooks vorkommt und dies zum Schreiben
einer Kette von Definitionen führt - ist die Grösse der von DumpSave[]
geschriebenen Files unabhängig davon, ob eine Umbenennung erfolgte oder
nicht erfolgte?
Offensichtlich speichert DumpSave noch weitere Informationen neben den
eigentlichen Zahlen - aber welche?
Das findet man auf einfachste Weise heraus, indem man nach dem DumpSave[]
Mma beendet. Dann startet man es neu, öffnet ein neues Notebook, lädt das
dump file theArray.mx mit Get[] und tippt
Names["Global`*"]
Falls eigene Kontexte - d.h. andere als Global` - durch das Get[]
eingeführt werden, kann man das mit dem Ruf von Contexts[] vor und nach
dem Get[] und einem Mengendurchschnitt feststellen und nach den Symbolen
dieser Kontexte entsprechend suchen.
Mit den besten Grüssen
Udo.