大数据的问题

时间:2011-06-21 13:55:30

标签: c# asp.net wcf performance caching

我有从Wml读取数据的WCF服务。 xml中的数据每1分钟更改一次。 这个xml非常大,它有大约16k的记录。解析这个大约需要7秒。所以它绝对要长。

现在它以这种方式运作:

  1. ASP.NET调用WCF
  2. WCF解析xml
  3. ASP.NET正在等待WCF回调
  4. WCF向ASP.NET提供数据
  5. 当然有1分钟的缓存但是在它之后WCF必须再次加载数据。

    是否有可能制作能够在不停止网站的情况下刷新数据的内容?像......我不知道,双缓冲?如果没有新数据,它将检索旧数据?也许你知道更好的解决方案吗?

    最好的问候

    编辑: 花费时间最长的陈述:

            XDocument = XDocument.Load(XmlReader.Create(uri)); //takes 7 sec.
    

    解析需要70毫秒,它的okey,但这不是问题。有没有更好的解决方案,不要阻止网站? :)

    EDIT2: 好的,我找到了更好的解决方案。简单地说,我将xml下载到hdd并从中读取数据。然后其他进程开始下载新版本的xml并替换旧版本。参与的Thx。

3 个答案:

答案 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开销,请尝试用较短的内容替换长元素名称(如单个字符元素名称)。

看看这个:

  1. What is the easiest way to add compression to WCF in Silverlight?
  2. Create JSON from C# using JSON Library

答案 2 :(得分:0)

如果你采用一些stackshots,它可能会告诉你最大的“瓶颈”不是解析,而是数据结构分配,初始化和后续的垃圾收集。如果是这样,解决它的方法是拥有一个预先分配的行对象池并重新使用它们。

此外,如果每个项目都附加到列表中,您可能会发现它花费了大量时间来执行追加。简单地按下前面的每一个新行,然后在最后反转整个列表可能会更快。

(但是,除非你通过stackshots证明它们是问题,否则不要实现这些东西。在此之前,它们只是猜测。)

根据我的经验,XML的实际成本不是解析,而是数据结构操作。