2017-07-27 1 views
-1

J'ai créé une application WPF qui utilise un trie (basé sur this one) pour stocker un dictionnaire polonais (37,9 Mo). La créer à partir du dictionnaire.txt prend trop de temps (30 secondes sur mon ordinateur portable). Je pensais que peut-être que si je créais une sorte de fichier binaire avec un fichier déjà fait et que je le chargeais à la place, cela accélérerait les choses.Comment enregistrer/charger un fichier créé dans C# WPF

Répondre

0

Vous pouvez essayer de l'enregistrer en tant qu'objet sérialisé, au format XML ou binaire. Vous devrez marquer les classes qui seront sérialisées avec l'attribut. Les collections génériques sont déjà sérialisables.

[Serializable] 
public class Node 
{ 
... 
} 

[Serializable] 
public class Trie 
{ 
... 
} 

XML Enregistrer

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 Charge

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

binaire Save

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); 
} 

Charge binaire

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

Quelle est la différence entre les deux? Et comment (non) portable sont ces solutions? Si je fais une version de mon application, cela fonctionnera-t-il sur tous les Windows (avec .NET)? – Jecke

+0

Donc, mon expérience avec la sérialisation est que XML est plus sûr entre les versions du programme, mais binaire est plus rapide et entraînera probablement une taille de fichier beaucoup plus petite. Lorsque vous sérialisez un fichier en binaire, il est lié à une version de la classe, le programme peut être mis à jour mais la modification de la classe sérialisée rompt généralement la capacité de charger le fichier sauf si vous implémentez ISerializable et exécutez vous-même toutes les fonctions de sérialisation. XML est plus sûr entre les révisions, mais il contient beaucoup de surcharge dans le fichier de sauvegarde sous la forme de mise en forme. Les deux sont portables. –

+0

J'ai essayé d'utiliser la sérialisation binaire (j'ai simplement copié votre code, en changeant 'trie' avec mon dictionnaire polonais chargé et' "path" '' "dict.xml" ') et le fichier que j'ai obtenu est assez gros: 54.2MB (par opposition à 37,9 Mo de dictionary.txt). J'ai essayé de le charger (encore une fois, j'ai simplement copié votre code en changeant 'return' à' Trie my_dictionary = ') mais il est resté bloqué ou chargé pendant quelques minutes maintenant ... Est-ce que je fais quelque chose de mal ou y at-il un autre problème? – Jecke