庞大数据的问题
本文关键字:问题 数据 | 更新日期: 2023-09-27 17:59:41
我有WCF服务,它从xml中读取数据。xml中的数据每1分钟更改一次。这个xml非常大,大约有16k条记录。解析这个大约需要7秒,所以它肯定太长了。
现在它是这样工作的:
- ASP.NET调用WCF
- WCF解析xml
- ASP.NET正在等待WCF回调
- WCF将数据返回给ASP.NET
当然,缓存时间为1分钟,但之后WCF必须再次加载数据。
有没有可能在不停止网站的情况下制作一些刷新数据的东西?类似。。。我不知道,双重缓冲?如果没有新数据,它将检索旧数据?也许你们知道更好的解决方案?
向致以最良好的问候
编辑:耗时最长的语句:
XDocument = XDocument.Load(XmlReader.Create(uri)); //takes 7 sec.
解析需要70毫秒,这是可以的,但这不是问题所在。有没有更好的解决方案不屏蔽网站?:)
第2版:好的,我找到了一个更好的解决方案。简单地说,我将xml下载到hdd并从中读取数据。然后另一个进程开始下载新版本的xml并替换旧版本。感谢您的参与。
您似乎拥有从XML创建对象模型的XML到对象工具。
通常花费大部分时间的不是解析,而是创建所有这些对象来表示数据。
因此,您可能希望只提取XML数据的一部分,这对您来说会更快,而不是系统地创建一个大的对象树来只提取其中的一部分
例如,您可以使用XPath从XML文件中提取所需的部分。
我过去使用过一个很好的XML解析工具,它专注于性能。它被称为vtd-xml(请参阅http://vtd-xml.sourceforge.net/)。
它支持XPath和其他XML技术。
有一个C#版本。我使用过Java版本,但我确信C#版本具有相同的质量。
LINQ to XML也是一个不错的工具,它可能会为您带来好处。
这一切都取决于您的数据库设计。若您设计数据库的方式可以识别哪些数据已经被查询,那个么对于每个新查询,只返回从上次查询时间到当前时间的记录差异。
也许你可以为每条记录添加rowstamp,并在每次添加/编辑/删除操作时更新它,然后你就可以很容易地从这个答案的一开始就实现逻辑。
此外,如果您不希望第一次调用花费很长时间(当必须收集初始数据时),请考虑将数据存储在本地。
使用其他东西,然后使用XML(如JSON)。如果您有很大的XML开销,请尝试将长元素名称替换为较短的名称(如单字符元素名称)。
看看这个:
- 在Silverlight中向WCF添加压缩的最简单方法是什么
- 使用JSON库从C#创建JSON
如果你使用一些stackshot,它可能会告诉你最大的"瓶颈"不是解析,而是数据结构分配、初始化和随后的垃圾收集。如果是这样的话,解决方法是拥有一个预先分配的行对象池并重用它们。
此外,如果每个项目都被附加到列表中,您可能会发现它花费了很大一部分时间来进行附加。简单地将每一个新行推到前面,然后在末尾反转整个列表可能会更快。
(但是,除非你通过堆栈证明它们是问题,否则不要实现这些东西。在那之前,它们只是猜测。)
根据我的经验,XML的真正成本不是解析,而是数据结构操作。