序列化大型响应时,客户端收到ServiceStack异常,Out of Memory,

时间:2013-05-31 20:17:31

标签: serialization mono servicestack

我在带有apache / mod_mono的linux机器上有一个ServiceStack RESTful Web服务。

    public DataSetResponse Get(DataRequest req)
    {
        DataSetResponse Response = new DataSetResponse(); 
        DataSet BigData = new DataSet();

        this.Status = this.DataFetcher(ref BigData);   
        Response.Data = BigData;
        Response.Status = this.Status;         

        System.Threading.Thread.Sleep(30000);         
        return Response;
    }

当线程休眠时,我可以看到单声道占据内存的8%。 30多秒后,当单声道再次具有cpu活动时,内存会上升到90%,并且会抛出内存不足异常。 Mono继续运行,但没有释放它的记忆。

在小数据集(大小的1/10)上,它似乎工作正常,单声道有1%的内存。我认为在将数据对象流式传输到客户端之前,数据对象被序列化为Json时会发生内存增长。

这是对的吗?更重要的是,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我不知道您的服务器有多少内存,但是如果它在一个请求中最大化,我假设因为它是一个Web服务,您希望服务于多个客户端,因此您可能会获得2个或更多在大约同一时间,这些请求中,您可能需要考虑某种方式来流式传输或分块数据(即,客户端可以一次请求一页数据,并且他们可以继续要求更多页面,直到他们拥有整个数据集。)

因此,您的请求DTO可能包含页面#,您的数据提取程序将抓取下一页(基于您决定每页的记录数),并将其返回。

您的回复需要包含总页数,并返回页面,以便客户端决定继续获取数据。

你可能在序列化之前看到8%的原因是对象是二进制格式 - 将它转换为一个大的,JSON字符串真的会让它膨胀。

您还可以考虑ServiceStack支持的其他二进制格式 - ProtoBuf和MessagePack。