Ich entwickle eine App, die sehr große Nachschlagetabellen verwendet, um mathematische Berechnungen zu beschleunigen. Die größte dieser Tabellen ist ein int [] mit ~ 10 Millionen Einträgen. Nicht alle Nachschlagetabellen sind int []. Zum Beispiel ist ein Wörterbuch mit ~ 200.000 Einträgen. Derzeit I erzeugen einmal in jeder Nachschlagtabelle (die einige Minuten in Anspruch nimmt) und serialisiert sie auf die Festplatte (mit Druck) unter Verwendung der folgenden Schnipsel:Speichern großer Nachschlagetabellen
int[] lut = GenerateLUT();
lut.Serialize("lut");
wo Serialisieren wie folgt definiert ist:
public static void Serialize(this object obj, string file)
{
using (FileStream stream = File.Open(file, FileMode.Create))
{
using (var gz = new GZipStream(stream, CompressionMode.Compress))
{
var formatter = new BinaryFormatter();
formatter.Serialize(gz, obj);
}
}
}
The Ärger habe ich beim Starten der Anwendung, ist, dass die Deserialisierung dieser Nachschlagetabellen sehr lange dauert (über 15 Sekunden). Diese Art von Verzögerung wird den Benutzer verärgern, da die App unbrauchbar wird, bis alle Nachschlagetabellen geladen sind. Derzeit ist die Deserialisierung ist wie folgt:
int[] lut1 = (Dictionary<string, int>) Deserialize("lut1");
int[] lut2 = (int[]) Deserialize("lut2");
...
wo Deserialize ist definiert als:
public static object Deserialize(string file)
{
using (FileStream stream = File.Open(file, FileMode.Open))
{
using (var gz = new GZipStream(stream, CompressionMode.Decompress))
{
var formatter = new BinaryFormatter();
return formatter.Deserialize(gz);
}
}
}
Zuerst dachte ich, es könnte die gzip-Komprimierung haben, dass die Verlangsamung verursacht wurde, aber entferne es abgeschöpft nur einige hundert Millisekunden von den Serialisierungs-/Deserialisierungsroutinen entfernt.
Kann jemand vorschlagen, die Ladezeiten dieser Nachschlagetabellen beim ersten Start der App zu beschleunigen?
Ich stimme dem zu, aber es ist immer noch eine Art Workaround imo. In Bezug auf meine App ist die GUI einfach genug, dass ein Benutzer bereit ist, eine Berechnung in weniger als 5 Sekunden durchzuführen. Im Moment strebe ich Ladezeiten von 5 Sekunden oder weniger an (wobei die Nachschlagetabellen in weniger als 5 Sekunden im Hintergrund geladen werden). – snazzer