【问题标题】:Large file upload with Spark framework使用 Spark 框架上传大文件
【发布时间】:2016-07-25 17:01:03
【问题描述】:

我正在尝试使用 Spark framework 将大文件上传到 Web 应用程序,但我遇到了内存不足错误。 spark似乎正在将请求正文缓存在内存中。我想在磁盘上缓存文件上传,或者将请求作为流读取。

我尝试使用 Apache Commons FileUpload 的 streaming support,但似乎调用 request.raw().getInputStream() 会导致 Spark 将整个正文读入内存并返回该内存块的 InputStream 视图,由this code 完成。根据文件中的注释,这样可以多次调用 getInputStream。有没有办法改变这种行为?

【问题讨论】:

    标签: jetty spark-java


    【解决方案1】:

    我最近遇到了同样的问题,我发现你可以绕过缓存。我使用以下功能:

    public ServletInputStream getInputStream(Request request) throws IOException {
        final HttpServletRequest raw = request.raw();
        if (raw instanceof ServletRequestWrapper) {
            return ((ServletRequestWrapper) raw).getRequest().getInputStream();
        }
    
        return raw.getInputStream();
    }
    

    这已经用 Spark 2.4 进行了测试。

    我不熟悉 Spark 的内部工作原理,所以这个函数的一个潜在的小缺点是你不知道你是否获得缓存的 InputStream,缓存的版本是可重用的,非缓存的是不是。

    为了克服这个缺点,我想你可以实现一个类似于以下的函数:

    public boolean hasCachedInputStream(Request request) {
        return !(raw instanceof ServletRequestWrapper);
    }
    

    【讨论】:

      【解决方案2】:

      简短的回答不是我能看到的。

      SparkServerFactory 构建具有私有静态类 HttpRequestWrapper 的 JettyHandler,然后将 InputStream 处理到内存中。

      所有这些静态的东西都意味着没有可用的扩展。

      【讨论】:

        猜你喜欢
        • 2017-04-14
        • 2018-04-02
        • 2021-09-27
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        • 2013-10-25
        • 2016-10-03
        • 1970-01-01
        相关资源
        最近更新 更多