我有一个关于如何有效地存储和检索blob列(data_type:binary)的大量数据的问题。大多数示例和代码都显示了简单的分配,但对于大量数据而言效率不高。例如,从文件存储数据可能是这样的:
# assume a model MyFileStore has a column blob_content :binary
my_db_rec = MyFileStore.new
File.open("#{Rails.root}/test/fixtures/alargefile.txt", "rb") do |f|
my_db_rec.blob_content = f.read
end
my_db_rec.save
显然,这会将整个文件内容读入内存,然后再将其保存到数据库中。这不是保存blob的唯一方法。例如,在Java和.Net中,有一些方法可以流入和流出blob列,因此您不会将所有内容都拉入内存(请参阅右侧的类似问题)。在rails中有类似的东西吗?或者我们仅限于在Rails应用程序中存储在blob中的小块数据。
答案 0 :(得分:0)
如果这是Rails 4,您可以使用渲染流。这是一个例子Rails 4 Streaming
我会问你使用的是什么数据库,以及将文件存储在文件系统(亚马逊s3,谷歌云存储等等)中是否更好,因为这会极大地影响你管理blob的能力。例如,Microsoft提出了以下建议:To Blob or Not to Blob
上传通常通过表格完成,一次或多部分。多部分对数据进行分块,因此您可以更自信地上传更大的文件。这些块被重新组装并存储在您在模型中定义的任何数据库字段(和类型)中。
下载可以流式传输。将上传和流式传输到亚马逊s3等第三方云存储系统有很大的趋势。这大大减轻了铁轨的负担。您还可以将上传职责交给您的Web服务器。所有现代Web服务器都有一种从用户流式传输文件的方法。这样做可以避免内存问题,因为只有当前上传的块在任何给定时间都在内存中。上传完成后,Web服务器也应该能够通知您的应用程序。
对于输出的一般流式传输:
要将流添加到模板,您需要从控制器中传递:stream选项,如下所示:render stream: true
。您还需要使用response.stream.close
显式关闭流。由于呈现模板和布局的方法随流式传输而变化,因此必须注意加载标题等属性。这需要使用content_for
而不是yield
来完成。您可以使用Live API显式打开和关闭流。为此你需要美洲狮宝石。另请注意,您需要一个支持流式传输的Web服务器。您可以配置Unicorn以支持流式传输。