读取XML文件会引发异常 - >系统内存不足异常?

时间:2014-10-06 07:19:31

标签: c# xml list memory

我一直在使用XNA和Win-forms开发3D查看器。我使用一个简单的概念来保​​存和读取XML文件中的数据以重建3D环境。

现在我正在尝试加载更大的XML文件,并在生成3D环境时引发异常:

    [System out of memory exception]

我不明白为什么,因为在异常被提出后我的文件不是很重,它大约是80 MB。在生成高达80 MB的XML文件期间看到异常引发是否正常?

使用的开发环境

  • Microsoft Windows 7(x64)位
  • Visual Studio 2013专业更新3
  • 16.0 GB(15.9GB可用)Ram
  • Intel i7 - 2670QM CPU @ 2.20GHz
  • 请注意,这是一个32位应用程序(XNA> 32位)

我确实使用ANTS内存分析器进行了测试,以检查垃圾收集器的工作原理: 由于声誉而无法发布图片......

结果表明Class Vector3 []是罪魁祸首:

Microsoft.Xna.Framework Vector3 []将表单0(字节)增加到305 218 872(字节)。

代码: 读取Xml文件并将具有属性的对象(basic-Model,-Mesh,-MeshPart)加载到内存中。这是在3D世界中显示模型所必需的。

创建一个包含basic-model,-mesh,-meshPart类型对象的专用类。该类将包含有关模型,网格,meshpart的额外信息,并具有指向数据库的链接。然后我将新类的新对象加载到3个列表(模型,网格和meshPart列表)中。

然后我在整个项目中遍历这些列表以执行所需的操作。

问题出现在:

  1. 我添加了模型。
  2. 保存到我的xml文件。
  3. 再次加载该文件 !!!
  4. 所以我假设读取xml文件是问题......

    或者可能是带有对象的列表太大了?


    阅读文件:

     foreach (string directory in Directory.GetDirectories(tempPath))
        {
          string directoryName = Path.GetFileName(directory); //Get the directory name.
    
          if (directoryName == "Models") //If it is the Models directory name.
          {
            foreach (string filePath in Directory.GetFiles(directory))
            {
               if (Path.GetExtension(filePath) == ".xml") //If a .xml file.
               {
                  Model_Data data = Model_Storage.Load(filePath);
                  modelList.Add(data);
               }
            }
          }
        }
    
    
    
      public static Model_Data Load(string FilePath)
        {
           Model_Data data = Serialization.XNA_XML_Deserialize<Model_Data>(FilePath);
           data = XNB_Path_Load(data, FilePath);
           data = Texture_Custom_Load(data, FilePath);
           data = Linked_Files_Load(data, FilePath);
           return data;
        }
    
        public static T XNA_XML_Deserialize<T>(string LoadPath)
        {
            using (XmlReader reader = XmlReader.Create(LoadPath))
            {
                return IntermediateSerializer.Deserialize<T>(reader, null);
            }
        }
    

    这是专门类的构造函数查找模型的方式:

    public Spec_Model(Basic_Model _Model, int _ID_3Dem = -1)
    {
       bModel = _Model; //object of basic-model 
       ID_3Dem = _ID_3Dem;
       Model_Vertices = Generate_Vertices();
       Model_Hash = Generate_Hash();
       State = ModelState.New;
    }
    

    这里我保存了专门的类对象以供将来使用:

    FAC_Model fac_Model = new FAC_Model(Model, ID_3Dem);
    lst_FAC_Models.Add(fac_Model);
    
    foreach (Basic_Mesh Mesh in Model.Mesh_Collection)
    {
       FAC_Mesh fac_Mesh = new FAC_Mesh(Mesh, Model.Unique_Identifier);
       lst_FAC_Mesh.Add(fac_Mesh);
    
       int meshPartCounter = 0;
       foreach (Basic_Mesh_Part_Properties Mesh_Part in Mesh.Properties.Mesh_Part_Properties)
       {
          meshPartCounter++;
          FAC_MeshPart fac_MeshPart = new FAC_MeshPart(Mesh_Part,Model.Unique_Identifier,Mesh.Properties.Unique_Identifier, meshPartCounter.AsStr());
          lst_FAC_MeshPart.Add(fac_MeshPart);
       }
    }
    

    将较小的xml文件加载到60mb时没有问题。

    在我要加载的文件中:

    • Models = 18
    • 网格= + -3200
    • MeshParts = + - 4000

    有什么建议吗?

0 个答案:

没有答案