在Sinatra和Thin上下载大文件占用大量内存

里奥·科雷亚

我正在Thin上运行Sinatra应用程序。

这是代码的简化外观:

class StreamApp < Sinatra::Base
  get "/" do
    s3_object = # large S3 object (not loaded into memory)
    stream do |out|
      s3_object.read do |chunk|
        out << chunk
      end
    end
  end
end

随着流的继续,盒子上的内存开始增加到达到最大值的程度,该过程即将终止。

我从2009年开始读过文章,这是EventMachine和Rack缓冲数据直到整个响应完成之前的问题。

有没有人看过这个问题或找到了解决方法?

帕特里克

sinatra中流式传输在eventmachine下工作的方式是,对于out << chunksinatra的每个调用,都会在eventmachine中安排一个调用以发送块。您的代码的问题在于,它阻塞了eventmachines事件循环,直到读取了整个文件并完成了读取。因此,直到所有数据都存储在内存中之前,什么也不会发送。

这可以通过以下方法解决:

get "/" do
s3_object = # large S3 object (not loaded into memory)
  stream :keep_open do |out|
    reader = lambda {
       chunk = s3_object.read
       break if chunk == nil
       out << chunk
       EM::next_tick &reader
    }
    reader.call
  end
end

一旦事件机器准备就绪,它将立即读取一个块,而不会阻塞事件循环。当然,在这种情况下,s3_object.read一次只需要返回一个块。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用GCD进行大文件复制-调度IO占用大量内存

来自分类Dev

使用GCD进行大文件复制-调度IO占用大量内存

来自分类Dev

Rails + Thin:无法下载大文件

来自分类Dev

iAd和AdMob占用大量内存

来自分类Dev

使用内存流下载大文件

来自分类Dev

BigInteger占用大量内存

来自分类Dev

文件数据到阵列占用大量内存

来自分类Dev

文件数据到阵列占用大量内存

来自分类Dev

在 PHP 中读取/下载大文件而不会耗尽内存

来自分类Dev

Web Worker占用大量内存

来自分类Dev

Android App占用大量内存

来自分类Dev

功能简单,占用大量内存

来自分类Dev

Android服务占用大量内存

来自分类Dev

功能简单,占用大量内存

来自分类Dev

使用AFNetworking NSOperations连续下载大量文件.....内存不足

来自分类Dev

下载大文件

来自分类Dev

大文件下载cherrypy

来自分类Dev

下载大文件

来自分类Dev

大文件下载cherrypy

来自分类Dev

从HDFS下载大文件

来自分类Dev

CorePlot多个散点图占用大量内存

来自分类Dev

pmap通过python脚本占用大量内存

来自分类Dev

空闲的postgres进程占用大量内存

来自分类Dev

简单的多线程Haskell占用大量内存

来自分类Dev

HDInsight Emulator占用大量内存;如何禁用?

来自分类Dev

'zeitgeist-fts'总是占用大量内存!

来自分类Dev

空闲的postgres进程占用大量内存

来自分类Dev

单个位图占用大量内存

来自分类Dev

HDInsight Emulator占用大量内存;如何禁用?