2009-10-09 45 views
1

我使用VB.Net,我有一套数据,我必须能够相当快地过滤。基本上,该程序就像谷歌Sugest,但不是一个下拉菜单,我使用的是一个列表框。当用户输入一个单词时,我会比较使用LINQ的单词并过滤那些包含用户输入的单词。数据都是可变长度的字符串(从0到200个字符,大多数在150个字符标记上),并且我有240,000多个字符串和计数 - 全部存储在XML文件中。我应该在应用程序启动时将所有内容加载到内存中吗?

我的一位同事告诉我,将所有内容加载到内存中(使用VB.Net的XML串行器加上字符串/对象集合)是不实际的,并且会减慢程序的“启动”时间。我还没有完成这个程序,我对继续这个道路有了第二个想法。

所以,我的问题是:我应该继续我目前的问题(这是一切加载到存储器上启动),或者是有解决我的困境的一种更好的方式方法呢?

回答

4

如果你想阻止的启动时间,并保持它在内存中是在性能上没有问题,然后异步加载它。尽管从XML中加载240.000多个字符串并将其保存在内存中听起来并不是最好的想法。可能数据库会是更好的方法。或者至少有一些像JSON这样的解析速度更快的格式。

+2

+1使用数据库。另外,这是.NET中'BackgroundWorker'组件的很好的候选者 - 它确实应该做异步。 – 2009-10-09 22:39:15

+2

做这种事情异步可能会被高估。如果用户无法用应用程序做任何事情*直到整个数据集被加载并可搜索,那么异步加载是没有意义的。不过,数据库是个好主意。 – MusiGenesis 2009-10-09 22:54:36

+0

@MusiGenesis那么,如果这是当然的情况。但是如果两者之间存在一个页面,或者需要执行某些其他操作(例如在访问特定区域之前填充其他字段),则可以避免用户查看等待应用程序加载的启动屏幕。 – 2009-10-09 23:12:23

0

取决于很多事情:

If 
((you know the strings will not hugely increase in number) && 
(you know the spec of the machines that will run your app) && 
(you are able to test that the load time is *good enough* on the above spec)) 
{ 
**don't bother changing approach.** 
} 
else 
{ 
**change approach.** 
} 

另一种方法显然是某种非同步延迟加载的。

+0

-1(虚拟)为你的蛇Plissken头像。 – MusiGenesis 2009-10-09 22:56:11

+0

我认为你不是粉丝:) – JohnIdol 2009-10-09 23:15:18

0

你在谈论加载大致字符串36MB。虽然这不是一个令人生畏的数量(尽管你可以更快地读取XML来加载它......如果我担心性能,我不会使用序列化引擎),但这也是一个不重要的数量。假设你不像Mircea所说的那样异步执行,你正在寻找一个启动时间加上几秒钟的时间。

如果你不这样做异步,你必须确保它依赖于数据的任何UI过程中不会发生,直到它加载之后。这可能是一个难以确保的事情。

0

它可能不是一个坏主意,当应用程序启动时将XML加载到内存中。但如果你走这条路线,我会考虑使用BackgroundWorker线程。这个想法是将XML加载到内存中,以便UI在这种情况下仍然能够响应。就用户而言,应用程序不应该开始慢一点,但一旦完成,类似Google的建议功能应该会显着加快。

我必须说,即使在内存中,这是一种固有的低效操作,因为在以这种方式查询XML文件时没有使用索引的优势。这是在full-text searching SQL中快10倍的东西。

当然XML中具有作为自包含的,无需附加的部件的优点。这使它成为查询少量数据的小型桌面应用程序的不错选择。否则,我会考虑使用数据库来获得更好的性能。

0

这个问题似乎意味着一个在线应用。一些建议,如果是这样的话:

  • 数据可以/应该是拉链。我怀疑它会非常好地压缩。
  • 也许数据可能是缓存在多个会话中,可能作为html内容与适当的过期缓存日期交付。这将节省系统负载,并且如果数据不经常更新,则可能是可行的。
  • 建议功能特征可以(在应用程序初始化缓存,异步即说呈现出“加载...”消息)进行初始禁用。以这种方式,即使建议功能可能滞后达30秒左右,该应用程序在启动时也可快速使用。

编辑:独立的数据如何被下载并缓存,我秒米尔恰Grelus的认为,这种规模的xml文件是数据库的一个贫穷的替代品。

0

通过使用二进制序列化而不是XML序列化可以更好地服务于保存应用程序在启动时读取的数据,特别是如果您最终实现的搜索速度比“StringCollection”快。当然,您仍然可以在某处维护数据的XML版本。

通过一切手段,使用BackgroundWorker来异步加载数据,如果这会让您的应用程序感觉更具响应性。

相关问题