如何保存/加载在c#WPF中创建的trie
我制作了一个WPF应用程序,它使用trie(基于)来存储波兰语词典(37.9MB)。从dictionary.txt创建它花费了太多的时间(在我的笔记本电脑上30秒)如何保存/加载在c#WPF中创建的trie,c#,wpf,optimization,trie,C#,Wpf,Optimization,Trie,我制作了一个WPF应用程序,它使用trie(基于)来存储波兰语词典(37.9MB)。从dictionary.txt创建它花费了太多的时间(在我的笔记本电脑上30秒) 我想,如果我创建了某种二进制文件,并且已经完成了trie,然后将其加载,可能会加快速度。您可以尝试将其保存为一个序列化对象,可以是XML或二进制。您需要标记将使用该属性序列化的类。泛型集合已可序列化 [Serializable] public class Node { ... } [Serializable] public cla
我想,如果我创建了某种二进制文件,并且已经完成了trie,然后将其加载,可能会加快速度。您可以尝试将其保存为一个序列化对象,可以是XML或二进制。您需要标记将使用该属性序列化的类。泛型集合已可序列化
[Serializable]
public class Node
{
...
}
[Serializable]
public class Trie
{
...
}
XML保存
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加载
XmlSerializer xmls = new XmlSerializer(typeof(Trie));
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
return xmls.Deserialize(fs) as Trie;
二进制存储
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);
}
二进制加载
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;
}
这两者有什么区别?这些解决方案的可移植性如何?如果我为我的应用程序制作一个发布版本,它会在所有的窗口上运行吗(使用.NET)?因此,我的序列化经验是,XML在不同版本的程序之间更安全,但二进制更快,并且很可能会导致小得多的文件大小。当您使用二进制文件序列化文件时,它几乎与类的某个版本绑定在一起,程序可以更新,但是更改序列化类通常会破坏加载文件的能力,除非您自己实现ISerializable并执行所有序列化函数。XML在修订之间更安全,但在以格式形式保存文件时会包含大量开销。两者都是可移植的。我尝试使用二进制序列化(我只是简单地复制了您的代码,将
trie
更改为我的trie,并加载了波兰语词典,“path”
更改为“dict.xml”
),我得到的文件非常大:54.2MB(而不是37.9MB的dictionary.txt)。我尝试加载它(再次,简单地将您的代码更改return
复制到Trie my_dictionary=
),但它要么卡住了,要么加载了几分钟。。。我是做错了什么,还是还有其他问题?2.你似乎把你的评论混合在了二进制文件中,然后将其保存为xml。所以我假设你指的是二进制。如果将文件保存为二进制文件,请不要使用像xml这样的扩展名,否则会破坏可能认为它是xml文件的任何其他系统。使用dict.dat或其他非标准扩展名。我不希望它花费比您的系统读取54MB所花费的时间更长的时间,最多几秒钟。保存和读取的方法是否相同?您确定写入程序已关闭,并且read语句没有等待文件可用吗?首先我保存了它,然后重写了代码以加载它。函数是如何更改的:保存和加载。顺便说一下,当我将它另存为.dat时,大小是266MB。