不考虑数据分批的情况下,有办法解决这个问题吗,json.net默认的内存分配是多少呢。
经过测试,发现不是json.net的原因,是所有序列化方法在数据量过大时都会内存溢出。包括自带的JavaScriptSerializer,应该是数据量的原因,在内存充足的前提下,怎么突破这个限制,是需要解决的问题。
试试下面的代码
var blogPost = new { Title = "Hello World" };
var json = string.Empty;
using (var ms = new MemoryStream())
using (var writer = new StreamWriter(ms))
using (var jsonWriter = new JsonTextWriter(writer))
{
var serializer = new JsonSerializer();
serializer.Serialize(jsonWriter, blogPost);
jsonWriter.Flush();
using (var sr = new StreamReader(ms))
{
ms.Seek(0, 0);
json = sr.ReadToEnd();
}
}
测试了,这样也不行,还是溢出,现在唯一不溢出的办法就是写个自定义方法,拼接出json字符串。
@清海扬波: json字符串有多大?
@dudu: 十几万数据放文本里面,有几十M。但重点是序列化没有地方可以控制内存使用限制。
可以考虑使用Stream方式,
然后,json.net 内存,我认为它是 .net 中的object,都是由 CLR 来管理的,可以从这个方向来增加可用内存。
是否能配置内存使用大小,本机物理内存占用不到80%,应该是够的,怀疑json.net限制了内存使用。
@清海扬波:
你试下,我不确定有没有用
var p = Process.GetCurrentProcess();
p.MaxWorkingSet = (IntPtr)33333333;
如下尝试看看(同楼上考虑使用流):
var serializer = new JsonSerializer();
using (var sr = new StreamWriter(stream))
using (var jsonTextWriter = new JsonTextWriter(sr))
{
serializer.Serialize(jsonTextWriter , obj);
}
测试了,这样也不行,还是溢出,现在唯一不溢出的办法就是写个自定义方法,拼接出json字符串。
具体的错误提示信息是什么?
– dudu 6年前@dudu: 代码是JsonConvert.SerializeObject,错误就是outmemory
– 清海扬波 6年前@清海扬波: 我认为是不是数据量过大,导致了超过了字符串的最大长度呢?
– Jeffcky 6年前@Jeffcky: 这个原因也怀疑过,经测试单独序列化,不存储结果也报错,所以可以排除这个原因。
– 清海扬波 6年前@清海扬波: 这种情况估计我认为只能分批序列化了【数据量太大了】
– Jeffcky 6年前