gpt4 book ai didi

c# - 读取 "Large"文件时内存不足异常

转载 作者:行者123 更新时间:2023-12-01 19:02:21 25 4
gpt4 key购买 nike

我正在尝试将对象序列化为字符串我遇到的第一个问题是 XMLSerializer.Serialize 方法抛出内存不足异常,我尝试了各种解决方案,但没有一个有效,所以我将其序列化到文件中。该文件大约有 300mb(32 位进程,8gb 内存),尝试使用 StreamReader.ReadToEnd 读取它也会导致内存不足异常。

XML 格式并将其加载到字符串上不是一个选项,而是必须的。问题是:

  • 300mb 文件会抛出这种异常有什么原因吗? 300mb 并不是一个真正的大文件。

序列化代码在 .Serialize 上失败

using (MemoryStream ms = new MemoryStream())
{
var type = obj.GetType();
if (!serializers.ContainsKey(type))
serializers.Add(type,new XmlSerializer(type));

// new XmlSerializer(obj.GetType()).Serialize(ms, obj);
serializers[type].Serialize(ms, obj);
ms.Position = 0;

using (StreamReader sr = new StreamReader(ms))
{
return sr.ReadToEnd();
}
}

序列化和读取文件在 ReadToEnd 上失败 var type = obj.GetType(); if (!serializers.ContainsKey(type)) Serializers.Add(类型,new XmlSerializer(type));

FileStream fs = new FileStream(@"c:/temp.xml", FileMode.Create);
TextWriter writer = new StreamWriter(fs, new UTF8Encoding());
serializers[type].Serialize(writer, obj);
writer.Close();
fs.Close();
using (StreamReader sr = new StreamReader(@"c:/temp.xml"))
{
return sr.ReadToEnd();
}

该对象很大,因为它是一个精心设计的系统整个配置对象......

更新:以卡盘(8*1024 个字符)读取文件会将文件加载到 StringBuilder 中,但构建器在 ToString() 上失败......开始认为没有办法,这真的很奇怪。

最佳答案

是的,如果您使用 32 位,尝试在一个 block 中加载 300MB 将会尴尬,特别是在使用不知道最终大小(字符数)的方法时,而不是字节)提前,因此必须不断将内部缓冲区加倍。这只是在处理字符串时!然后需要将其分解为 DOM,这通常会占用底层数据数倍的空间。最后,您需要将其反序列化为实际对象,通常再次进行大致相同的操作。

所以 - 事实上,尝试在 32 位中做到这一点将会很困难。

首先要尝试的是:不要使用 ReadToEnd - 只需将 XmlReader.Create 与文件路径或 FileStream 一起使用,并让 XmlReader 关心如何加载数据。不要加载它的内容。

之后...接下来要做的就是:不要将其限制为 32 位。

嗯,您可以尝试启用 3GB 开关,但是...迁移到 64 位会更好。

旁白:对于大量数据来说,xml不是一个好的选择。

关于c# - 读取 "Large"文件时内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27505145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com