0

我正在使用XmlReader ProductDoc = XmlReader.Create(path, settings);并且显然它正在关闭服务器,因为每次用户使用搜索工具时它都会从磁盘读取。

  1. 每次调用 XmlReader 都会调用磁盘内存,这是真的吗?
  2. 如果是这样,我怎么能从服务器内存而不是磁盘内存做到这一点
4

3 回答 3

2
  1. 是的,您的代码将从磁盘读取。

  2. 听起来您需要将数据放在服务器上的缓存中。这将涉及将文档作为 XDocument 或仅读取原始数据,并将其放入Page.Cache.

于 2013-02-22T17:47:05.663 回答
1

这是真的?

好吧,我们不知道这是否是导致您的服务器瘫痪的原因。但是,是的,它每次都会从磁盘读取它,至少在概念上是这样 - 如果文件被读取很多,我希望文件系统缓存文件。

如何从服务器内存而不是磁盘内存执行此操作

如果您的意思是“从内存而不是从磁盘”并且始终是相同的路径,那么我建议您只需将文档加载到内存中一次,例如

XDocument doc = XDocument.Load(path);

...然后在所有请求中重用它。只要您只是从中阅读,就应该没问题。如果需要,您可以从文档中创建一个新的阅读器,或者直接使用XDocument(这可能更简单)。如果需要,您可以加载XDocumentfrom anXmlReader作为替代方案。

于 2013-02-22T17:46:36.067 回答
0

使用

XmlReader.Create(Stream)

超载。然后使用 FileStream 将文件内容读入 MemoryStream(仅一次!),然后终止 FileStream 并仅使用 MemoryStream。

只需记住每次使用它创建 XmlReader 时将流的位置设置为 0,这意味着一次只能读取 1 个 XmlReader。

如果您正在运行网络服务器 (asp.net),则需要缓存 MemoryStream (Page.Cache)。或者,如果内存占用不是太可怕,您可以在 Session 中按每个用户缓存它。在 Session 中,您也不必担心多个阅读器访问。

于 2013-02-22T17:50:21.770 回答