Vb.net 我应该在应用程序启动时加载内存中的所有内容吗?

Vb.net 我应该在应用程序启动时加载内存中的所有内容吗?,vb.net,memory,Vb.net,Memory,我正在使用VB.Net,我有一组数据,我必须能够相当快地过滤。基本上,这个程序就像GoogleSugest,但我使用的不是下拉菜单,而是列表框。当用户输入一个单词时,我使用LINQ比较该单词并过滤包含用户输入的单词。这些数据都是长度可变的字符串(从0到200个字符,大多数在150个字符的标记上),我有240000多个这样的字符串和计数-都存储在一个XML文件中 我的一位同事告诉我,将所有这些加载到内存(使用VB.Net的XML序列化程序加上字符串/对象集合)是不实际的,并且会减慢程序的“启动”时

我正在使用VB.Net,我有一组数据,我必须能够相当快地过滤。基本上,这个程序就像GoogleSugest,但我使用的不是下拉菜单,而是列表框。当用户输入一个单词时,我使用LINQ比较该单词并过滤包含用户输入的单词。这些数据都是长度可变的字符串(从0到200个字符,大多数在150个字符的标记上),我有240000多个这样的字符串和计数-都存储在一个XML文件中

我的一位同事告诉我,将所有这些加载到内存(使用VB.Net的XML序列化程序加上字符串/对象集合)是不实际的,并且会减慢程序的“启动”时间。我还没有完成程序的构建,我正在重新考虑继续这条路


所以,我的问题是:我应该继续我目前的方法(即在启动时将所有内容加载到内存中),还是有更好的方法来解决我的难题?

如果您想阻止启动时间,并且将其保留在内存中不是性能问题,那么异步加载它。尽管从XML加载240.000+字符串并将其保存在内存中听起来并不是最好的主意。数据库可能是更好的方法。或者至少是像JSON这样解析速度更快的格式

如果您想阻止启动时间并将其保留在内存中不会影响性能,那么异步加载它。尽管从XML加载240.000+字符串并将其保存在内存中听起来并不是最好的主意。数据库可能是更好的方法。或者至少是像JSON这样解析速度更快的格式

取决于许多因素:

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.**
} 

另一种方法显然是某种异步延迟加载。

取决于许多因素:

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.**
} 

另一种方法显然是某种异步延迟加载。

您指的是加载大约36MB的字符串。尽管这并不是一个让人望而生畏的数量(尽管您自己阅读XML可能会更快地加载它……如果我担心性能的话,我不会使用序列化引擎),但这也是一个不小的数量。假设您没有像Mircea建议的那样异步启动,那么您需要在启动时间上增加几秒钟


如果以异步方式执行,则必须确保依赖于数据的任何UI进程在加载数据之前不会发生。这可能是一件很难保证的事情。

您说的是加载大约36MB的字符串。尽管这并不是一个让人望而生畏的数量(尽管您自己阅读XML可能会更快地加载它……如果我担心性能的话,我不会使用序列化引擎),但这也是一个不小的数量。假设您没有像Mircea建议的那样异步启动,那么您需要在启动时间上增加几秒钟


如果以异步方式执行,则必须确保依赖于数据的任何UI进程在加载数据之前不会发生。这可能是一件很难保证的事情。

在应用程序启动时将XML加载到内存中可能不是一个坏主意。但是如果你走这条路,我会考虑使用线程。这样做的想法是异步地将XML加载到内存中,以便UI在执行此操作时仍能响应。就用户而言,该应用程序的启动速度不应该再慢,但一旦启动,谷歌类似建议的功能应该会显著加快

我必须说,即使在内存中,这也是一种固有的低效操作,因为在以这种方式查询XML文件时,使用索引没有任何优势。这在SQL中的速度将提高10倍


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

在应用程序启动时将XML加载到内存中可能不是一个坏主意。但是如果你走这条路,我会考虑使用线程。这样做的想法是异步地将XML加载到内存中,以便UI在执行此操作时仍能响应。就用户而言,该应用程序的启动速度不应该再慢,但一旦启动,谷歌类似建议的功能应该会显著加快

我必须说,即使在内存中,这也是一种固有的低效操作,因为在以这种方式查询XML文件时,使用索引没有任何优势。这在SQL中的速度将提高10倍


当然,XML具有自包含和不需要额外组件的优点。这使得它成为查询少量数据的小型桌面应用程序的不错选择。否则,我会考虑使用一个数据库来提高性能。

< P>这个问题似乎暗示了一个在线应用程序。在这种情况下,有几点建议:

  • 数据可以/应该压缩。我想它会压缩得很好
  • 可能数据可以跨多个会话进行缓存,也可能作为html内容交付,并根据需要指定缓存到期日期。这将节省系统加载,如果数据不经常更新,这可能是可行的
  • 建议功能最初可能会被禁用(即,当应用程序异步初始化缓存时,显示“加载…”消息)。以这种方式,应用程序将在启动时快速可用,即使建议功能可能会延迟30秒左右
编辑:不管数据是如何下载和缓存的,我支持Mircea Grelus的观点,即这种大小的xml文件不能很好地替代数据库