我在带有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时会发生内存增长。
这是对的吗?更重要的是,我该如何解决这个问题?
答案 0 :(得分:1)
我不知道您的服务器有多少内存,但是如果它在一个请求中最大化,我假设因为它是一个Web服务,您希望服务于多个客户端,因此您可能会获得2个或更多在大约同一时间,这些请求中,您可能需要考虑某种方式来流式传输或分块数据(即,客户端可以一次请求一页数据,并且他们可以继续要求更多页面,直到他们拥有整个数据集。)
因此,您的请求DTO可能包含页面#,您的数据提取程序将抓取下一页(基于您决定每页的记录数),并将其返回。
您的回复需要包含总页数,并返回页面,以便客户端决定继续获取数据。
你可能在序列化之前看到8%的原因是对象是二进制格式 - 将它转换为一个大的,JSON字符串真的会让它膨胀。
您还可以考虑ServiceStack支持的其他二进制格式 - ProtoBuf和MessagePack。