servicestack,Serialization,Mono,servicestack" /> servicestack,Serialization,Mono,servicestack" />

Serialization 序列化大型响应时,客户端收到ServiceStack异常,内存不足,

Serialization 序列化大型响应时,客户端收到ServiceStack异常,内存不足,,serialization,mono,servicestack,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.DataFetche

我在带有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;
    }
当线程休眠时,我可以看到mono占top报告的内存的8%。30多秒后,当mono再次出现cpu活动时,内存将上升到90%,并引发内存不足异常。Mono继续运行,但不会释放内存

在小数据集(大小的1/10)上,它似乎工作正常,mono拥有1%的内存。我认为内存增长是在数据对象被序列化为Json时发生的,然后再流式传输到客户端


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

我不知道您的服务器有多少RAM,但如果它在单个请求上达到最大值,并且我假设,由于它是一个web服务,您希望为多个客户机提供服务,因此您可以在大约同一时间获得两个或更多这样的请求,您可能需要考虑一些方法来流或数据块(即,客户端可以一次请求一页数据,并且他们可以不断地请求更多的页面,直到他们拥有整个数据集)。 因此,您的请求数据可能包含一个页面,您的数据获取程序将获取下一个页面(根据您决定的每页记录数),并返回它

您的响应需要包括页面总数和返回的页面,以便客户机决定继续获取数据

在序列化之前,您可能会看到8%的原因是对象是二进制格式的——将其转换为一个大的JSON字符串将使其膨胀


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

< P>我不知道您的服务器有多少RAM,但是如果它在一个请求上被弹出,我推测,因为它是一个Web服务,你希望为多个客户端服务,这样你可以在同一时间得到2个或更多的这些请求,你可能想考虑一些方法来流或数据块。(也就是说,客户端可以一次请求一页数据,他们可以不断请求更多的页面,直到拥有整个数据集)

因此,您的请求数据可能包含一个页面,您的数据获取程序将获取下一个页面(根据您决定的每页记录数),并返回它

您的响应需要包括页面总数和返回的页面,以便客户机决定继续获取数据

在序列化之前,您可能会看到8%的原因是对象是二进制格式的——将其转换为一个大的JSON字符串将使其膨胀


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

第一次请求失败,它消耗3G内存。我希望使用POCO而不是创建特殊协议。我在看ToBuff.net;我的客户端现在是一个移动设备-IOS。对,您需要限制FIR。t请求一个页面,然后将其余的数据分页到客户端。另外,您可以使用带有MessagePack格式的POCO(不需要ProtoBuf之类的特殊属性)。查看此链接@for infoIt在第一次请求时失败,它会消耗3g内存。我希望使用POCO,而不是创建特殊协议。我正在查看ProtoBuf.Net;我的客户端是一个移动设备-目前为iOS。对-您需要将第一次请求限制为一个页面,然后将其余数据分页到客户端。还有您可以使用带有MessagePack格式的POCO(不需要ProtoBuf等特殊属性)。有关信息,请参阅此链接@