我尝试使用Spark framework将大型文件上传到网络应用程序,但我遇到内存不足错误。似乎spark正在缓存内存中的请求体。我希望将文件上传缓存在磁盘上,或者将请求作为流读取。
我尝试过使用Apache Commons FileUpload的streaming support,但看来调用request.raw()。getInputStream()会导致Spark将整个主体读入内存并返回一个InputStream视图那段记忆,由this code完成。根据文件中的注释,这样可以多次调用getInputStream。有没有办法改变这种行为?
答案 0 :(得分:0)
简短的回答不是我能看到的。
SparkServerFactory构建JettyHandler,它具有私有静态类HttpRequestWrapper,而不是将InputStream处理到内存中。
所有静态东西意味着没有可用的扩展。
答案 1 :(得分:0)
我最近遇到了同样的问题,我发现你可以绕过缓存。我这样做有以下功能:
var allHolidays = ClientContext.Holidays.ToList();
foreach (var holiday in clientDataObj.Holidays)
{
Holiday existingHoliday =
allHolidays.SingleOrDefault(h => string.Equals(h.Date, holiday.Date));
/* ... */
}
已经使用 Spark 2.4 进行了测试。
我不熟悉Spark的内部工作方式,所以一个潜在的,这个函数的一个小缺点是你不知道你是否得到缓存的InputStream,缓存的版本是可重用的,非缓存的是不
为了解决这个缺点,我想你可以实现类似于以下的功能:
public ServletInputStream getInputStream(Request request) throws IOException {
final HttpServletRequest raw = request.raw();
if (raw instanceof ServletRequestWrapper) {
return ((ServletRequestWrapper) raw).getRequest().getInputStream();
}
return raw.getInputStream();
}