C# System.Xml.Linq.XDocument.Save()导致硬盘驱动器满
我遇到了问题,需要帮助。我需要保存一个XML文件,大约400MB。我正在为此使用C# System.Xml.Linq.XDocument.Save()导致硬盘驱动器满,c#,.net,xml,linq,linq-to-xml,C#,.net,Xml,Linq,Linq To Xml,我遇到了问题,需要帮助。我需要保存一个XML文件,大约400MB。我正在为此使用System.Xml.Linq.XDocument.Save()。通常这没有问题,但有时我会有一种奇怪的行为,System.Xml.Linq.XDocument.Save()将Xml数据以无休止的循环方式保存在同一个Xml中,直到硬盘驱动器失效。再次获取相同的XML数据,没有问题,一切正常。所以直到现在,这种行为还不可能重现 我得到了一个新服务器,现在这是我得到的唯一结果,每次调用System.Xml.Linq.XD
System.Xml.Linq.XDocument.Save()
。通常这没有问题,但有时我会有一种奇怪的行为,System.Xml.Linq.XDocument.Save()
将Xml数据以无休止的循环方式保存在同一个Xml中,直到硬盘驱动器失效。再次获取相同的XML数据,没有问题,一切正常。所以直到现在,这种行为还不可能重现
我得到了一个新服务器,现在这是我得到的唯一结果,每次调用System.Xml.Linq.XDocument.Save()时!它是绝对可复制的…这是新的环境
- .Net Framework 4(也是4.5)
- Windows Server 2008 R2标准SP1
- 32 GB内存
- 64位
- 所有更新都已安装
以下是代码片段:
xmlImp = new XDocument(
new XDeclaration("1.0", null, null),
new XDocumentType("Hotelstamm", null, "hotel.dtd", null),
HotelStamm);
string pathUTF8 = path.Replace(".xml", "-utf8.xml");
try
{
xmlImp.Save(pathUTF8);
}
catch (IOException)
{
}
编辑:
问题是我们在多个线程中创建了Xml结构,XElement的.Add方法不是线程安全的。如果在多个线程中调用它,则会破坏Xml结构,Xml开始变得无限大 问题是,应用程序在我们的旧服务器上大约95%运行良好。但在新的测试中,成功的几率只有5%。
在旧服务器上,通过3次尝试的sinpmle循环使其工作。但是现在使用锁定可以很好地工作。重新检查代码时,我注意到您正在使用XDocument ctor 如果传递给构造函数的
HotelStamm
变量包含复杂的循环关系,则可能是无法在分层XML中有限表示
您可以尝试枚举xmlImp.subjects()
,看看是否得到相同的竞争行为
如果是这样的话,你有一个有问题的循环关系,你需要简化。注意,这与运行代码的机器规格没有直接关系。如果可以复制,请告诉我们如何复制。大概,您没有在具有该规范的机器上断言any
XDocument.Save()
调用会表现出这种行为,或者您是吗?我很悲观,这是一个会影响所有具有该规范的机器的通用问题,我想这更可能是特定构建的问题。但是,我没有在具有该规范的机器上使用XDocument.Save()
保存400MB XML文件的经验。因此,我无法证实我的怀疑。@Jodrell:好吧,所有的服务器几乎都是一样的:alle 2008 R2,所有32 GB Ram,所有64位。它们都运行相同的运行时版本。下面是代码片段:XmlImp=newxdocument(newxdeclaration(“1.0”,null,null),newxdocumenttype(“Hotelstamm”,null,“hotel.dtd”,null),Hotelstamm);字符串pathUTF8=path.Replace(“.xml”,“-utf8.xml”);尝试{XmlImp.Save(pathUTF8);}catch(IOException ioEx)
那么,如果只有一个出现了问题,有什么区别,或者,它们都这样做了吗?什么数据类型是HotelStamm
?它是否包含具有父子关联的层次结构?非常感谢,实际上它是XML结构。解决了的!问题是我们在多个线程中创建了Xml结构,XElement的.Add方法不是线程安全的。如果在多个线程中调用它,则会破坏Xml结构,Xml开始变得无限大。