2017-07-27 7 views
-1

Ich machte eine WPF-Anwendung, die einen Trie (basierend auf this one) verwendet, um ein polnisches Wörterbuch (37,9 MB) zu speichern. Das Erstellen aus der dictionary.txt dauert zu viel Zeit (30 Sekunden auf meinem Laptop).So speichern/laden Sie einen in C# WPF erstellten Trie

Ich dachte, dass, wenn ich eine Art Binärdatei mit einem Trie bereits erstellt und es stattdessen laden würde, würde es Dinge beschleunigen.

Antwort

0

Sie können versuchen, es als serialisiertes Objekt entweder XML oder Binär zu speichern. Sie müssten die Klassen markieren, die mit dem Attribut serialisiert werden. Generische Sammlungen sind bereits serialisierbar.

[Serializable] 
public class Node 
{ 
... 
} 

[Serializable] 
public class Trie 
{ 
... 
} 

XML speichern

var trie = new Trie(); 

using (var fs = new System.IO.FileStream("path", FileMode.CreateNew, FileAccess.Write, FileShare.None)) 
{ 
    Type objType = typeof (Trie); 
    var xmls = new XmlSerializer(objType); 

    xmls.Serialize(fs, trie); 
} 

XML laden

XmlSerializer xmls = new XmlSerializer(typeof(Trie)); 
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) 
    return xmls.Deserialize(fs) as Trie; 

Binary Speichern

var trie = new Trie(); 
using (var fs = new System.IO.FileStream("path", FileMode.CreateNew, 
FileAccess.Write)) 
{ 
    var bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
    bf.Serialize(fs, trie); 
} 

Binary Last

using (var fs = new FileStream("Path", FileMode.Open, FileAccess.Read)) 
{ 
     var bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
     return bf.Deserialize(fs) as Trie; 
} 
+0

Was ist der Unterschied zwischen den beiden? Und wie (un) portabel sind diese Lösungen? Wenn ich eine Release-Version meiner App mache, funktioniert sie dann auf allen Windowsen (mit .NET)? – Jecke

+0

So, meine Erfahrung mit der Serialisierung ist, dass XML zwischen Versionen des Programms sicherer ist, aber binär ist schneller und wird höchstwahrscheinlich zu einer viel kleineren Dateigröße führen. Wenn Sie eine Datei mit binary serialisieren, ist sie ziemlich an eine Version der Klasse gebunden, das Programm kann aktualisiert werden, aber das Ändern der serialisierten Klasse bricht normalerweise die Fähigkeit zum Laden der Datei, es sei denn, Sie implementieren ISerializable und führen alle Serialisierungsfunktionen selbst aus. XML ist sicherer zwischen Revisionen, aber würde viel Overhead in der Sicherungsdatei in Form von Formatierung enthalten. Beide sind tragbar. –

+0

Ich habe versucht, binäre Serialisierung (ich kopierte einfach Ihren Code, Ändern von 'Trie' zu ​​meinem Trie mit geladenen Polnisch Wörterbuch und '" Pfad "' '' 'dict.xml" ') und die Datei, die ich bekam, ist ziemlich groß: 54,2 MB (im Gegensatz zu 37,9 MB dictionary.txt). Ich habe versucht, es zu laden (wieder, kopieren Sie einfach Ihren Code ändern 'Rückkehr' zu 'Trie my_dictionary ='), aber es ist entweder stecken oder laden für ein paar Minuten jetzt ... Mache ich etwas falsch oder gibt es ein anderes Problem? – Jecke

Verwandte Themen