2011-07-13 52 views
0


我正在将大文件(〜200mb)直接保存到db中。
我有问题。
通过增加大量使用免费的RAM(约RAM和交换的3GB的3GB)在舞台上时引起的文件保存到数据库:将大文件上传到BLOB

@job.pdf = params[:job][:pdf].read 

完成此步骤后仍有一定的RAM和交换使用。
有什么方法可以优化吗?
p.s.项目在rails 3.0.3上,使用mysql,在mogrel上运行。

+2

您是否必须将文件保存到数据库?最好将文件保存到文件系统并在数据库中引用它。你有没有打算使用papercli? (https://github.com/thoughtbot/paperclip) – samullen

+0

我有一个类似的问题(想用我的评论来存储在线论文),并通过将论文存储在'/ public/res// '。这很容易实现,我的数据库保持很小。 – mliebelt

+0

问题是文件必须只能被应用程序访问。 – sfate

回答

2

在MySQL中,为了能够保存或读取大于1MB大小的BLOB字段,必须将服务器端参数max_allowed_pa​​cket增大到大于默认值。实际上,对于这个参数,你不能远远超过16-32MB。这种增长的价格是每个新的数据库客户端至少会消耗尽可能多的内存,而且一般情况下,服务器性能会受到很大影响。

换句话说,MySQL并不真正支持将大于1MB的BLOB字段(如果你不能或不想摆弄服务器配置)处理到大约16MB(即使你确实想这样做)。

这可能是一个哲学问题 - 在数据库中保留大的blob是否好主意?我认为对于许多任务(但并非所有)而言,这是一个好主意,而且由于MySQL非常糟糕(因为其他原因),我只是避免将它用作我的SQL服务器解决方案。

取而代之,我使用PostgreSQL,它完美支持BLOB(实际上,BYTEA)来宣传4GB的限制,而无需在客户端或服务器上进行任何调整。除此之外,它实际上会用LZ算法透明地压缩它们 - 稍微比gzip差,但仍然比没有压缩要好得多。