我有从Wml读取数据的WCF服务。 xml中的数据每1分钟更改一次。 这个xml非常大,它有大约16k的记录。解析这个大约需要7秒。所以它绝对要长。
现在它以这种方式运作:
当然有1分钟的缓存但是在它之后WCF必须再次加载数据。
是否有可能制作能够在不停止网站的情况下刷新数据的内容?像......我不知道,双缓冲?如果没有新数据,它将检索旧数据?也许你知道更好的解决方案吗?
最好的问候
编辑: 花费时间最长的陈述:
XDocument = XDocument.Load(XmlReader.Create(uri)); //takes 7 sec.
解析需要70毫秒,它的okey,但这不是问题。有没有更好的解决方案,不要阻止网站? :)
EDIT2: 好的,我找到了更好的解决方案。简单地说,我将xml下载到hdd并从中读取数据。然后其他进程开始下载新版本的xml并替换旧版本。参与的Thx。
答案 0 :(得分:2)
您似乎拥有XML to Object工具,可以从XML创建对象模型。
通常花费大部分时间的不是解析,而是创建所有这些对象来表示数据。
所以你可能只希望提取一部分更快的XML数据,而不是系统地创建一个大的对象树来仅提取部分数据。
例如,您可以使用XPath从XML文件中提取所需的部分。
我过去曾使用过很好的XML解析工具,专注于性能。它被称为vtd-xml(见http://vtd-xml.sourceforge.net/)。
它支持XPath和其他XML技术。
有一个C#版本。我使用过Java版本,但我确信C#版本具有相同的特性。
LINQ to XML也是一个很好的工具,它可能会为你做到这一点。
答案 1 :(得分:1)
这完全取决于您的数据库设计。如果您以某种方式设计数据库,则可以识别已查询的数据,那么对于每个新查询,只返回与上次查询时间到当前时间的记录差异。
也许您可以为每条记录添加rowstamp并在每次添加/编辑/删除操作时更新它,然后您可以从此答案的开头轻松实现逻辑。
此外,如果您不希望第一次调用需要很长时间(必须收集初始数据),请考虑在本地存储该数据。
使用其他东西然后使用XML(如JSON)。如果您有大量的XML开销,请尝试用较短的内容替换长元素名称(如单个字符元素名称)。
看看这个:
答案 2 :(得分:0)
如果你采用一些stackshots,它可能会告诉你最大的“瓶颈”不是解析,而是数据结构分配,初始化和后续的垃圾收集。如果是这样,解决它的方法是拥有一个预先分配的行对象池并重新使用它们。
此外,如果每个项目都附加到列表中,您可能会发现它花费了大量时间来执行追加。简单地按下前面的每一个新行,然后在最后反转整个列表可能会更快。
(但是,除非你通过stackshots证明它们是问题,否则不要实现这些东西。在此之前,它们只是猜测。)
根据我的经验,XML的实际成本不是解析,而是数据结构操作。