首页 新闻 会员 周边 捐助

json.net序列化大数据量,内存溢出

0
悬赏园豆:50 [已解决问题] 解决于 2018-09-25 13:42

不考虑数据分批的情况下,有办法解决这个问题吗,json.net默认的内存分配是多少呢。

问题补充:

经过测试,发现不是json.net的原因,是所有序列化方法在数据量过大时都会内存溢出。包括自带的JavaScriptSerializer,应该是数据量的原因,在内存充足的前提下,怎么突破这个限制,是需要解决的问题。

清海扬波的主页 清海扬波 | 小虾三级 | 园豆:825
提问于:2018-09-21 11:30

具体的错误提示信息是什么?

dudu 6年前

@dudu: 代码是JsonConvert.SerializeObject,错误就是outmemory

清海扬波 6年前

@清海扬波: 我认为是不是数据量过大,导致了超过了字符串的最大长度呢?

Jeffcky 6年前

@Jeffcky: 这个原因也怀疑过,经测试单独序列化,不存储结果也报错,所以可以排除这个原因。

清海扬波 6年前

@清海扬波: 这种情况估计我认为只能分批序列化了【数据量太大了】

Jeffcky 6年前
< >
分享
最佳答案
0

试试下面的代码

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();
    }
}
收获园豆:30
dudu | 高人七级 |园豆:31030 | 2018-09-21 13:31

测试了,这样也不行,还是溢出,现在唯一不溢出的办法就是写个自定义方法,拼接出json字符串。

清海扬波 | 园豆:825 (小虾三级) | 2018-09-21 14:38

@清海扬波: json字符串有多大?

dudu | 园豆:31030 (高人七级) | 2018-09-21 14:40

@dudu: 十几万数据放文本里面,有几十M。但重点是序列化没有地方可以控制内存使用限制。

清海扬波 | 园豆:825 (小虾三级) | 2018-09-21 15:43
其他回答(2)
0

可以考虑使用Stream方式,
然后,json.net 内存,我认为它是 .net 中的object,都是由 CLR 来管理的,可以从这个方向来增加可用内存。

放逐人 | 园豆:694 (小虾三级) | 2018-09-21 11:48

是否能配置内存使用大小,本机物理内存占用不到80%,应该是够的,怀疑json.net限制了内存使用。

支持(0) 反对(0) 清海扬波 | 园豆:825 (小虾三级) | 2018-09-21 12:54

@清海扬波:
你试下,我不确定有没有用
var p = Process.GetCurrentProcess();
p.MaxWorkingSet = (IntPtr)33333333;

支持(0) 反对(0) 放逐人 | 园豆:694 (小虾三级) | 2018-09-21 14:10
0

如下尝试看看(同楼上考虑使用流):

        var serializer = new JsonSerializer();
        using (var sr = new StreamWriter(stream))
        using (var jsonTextWriter = new JsonTextWriter(sr))
        {
             serializer.Serialize(jsonTextWriter , obj);
        }

收获园豆:20
Jeffcky | 园豆:2789 (老鸟四级) | 2018-09-21 13:33

测试了,这样也不行,还是溢出,现在唯一不溢出的办法就是写个自定义方法,拼接出json字符串。

支持(0) 反对(0) 清海扬波 | 园豆:825 (小虾三级) | 2018-09-21 14:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册