减少rake资产中的内存消耗:预编译

时间:2016-06-27 22:54:28

标签: ruby-on-rails ruby ruby-on-rails-4 docker bitbucket-pipelines

问题:
在自动构建中执行rake assets:precompile任务时,我的RAM耗尽。是否有任何策略可以执行增量预编译,或以其他方式执行预编译阶段而不消耗尽可能多的RAM?看起来该任务比构建的基线消耗大约850 MB。

上下文
我正在尝试获得一个Docker容器Bitbucket Pipelines版本的自动构建。应用程序堆栈包括Rails 4.2.7,PostgreSQL 9.3,Java 8,Maven 3.3.9和JRuby 9.1.2.0。我尝试使用Debian Jessie创建基于Alpine Linux的图像,但它在基线内存方面没有太大差别。

2 个答案:

答案 0 :(得分:4)

简短回答

使用NodeJS作为预编译的JavaScript解释器(或以低峰值RAM使用率为特征的另一个JavaScript解释器)。

更长的答案

对于上下文,我使用NodeJS 4.5.0与therubyracer v0.12.2和therubyrhino v2.0.4相比

你能增加RAM吗?

听起来很愚蠢,但在使构建过程复杂化之前,看看是否有更多功能可用的构建机器,或者交换空间是否可用(尽管它可能会增加构建时间)可能是有意义的。

您可以切换JavaScript解释器吗?

高峰值RAM利用率似乎是therubyrhino(Mozilla的Rhino JavaScript解释器)和therubyracer(V8 JavaScript解释器)的基本特征。似乎没有一种有效的方法可以显着降低资产预编译阶段消耗的RAM量。最可行的路径似乎是在构建生命周期之外预编译资产并将它们缓存到某个位置,以便可以获取它们而不是预编译as suggested by @user4776684。正如对该问题的评论所表明的那样,Rails版本和Ruby版本都会产生影响,但不会像JavaScript解释器那样多。

如果一切都失败了

作为@slowjack2k mentioned above,如果使用Bundler,则可以利用并行配置仅为预编译任务调用NodeJS,并保持原始构建相对不受影响。我没有调查这个,因为更容易切换解释器,但是虽然我能够使用rake和NodeJS预编译资产,但是当它涉及rake + therubyrhino调用时它们似乎没有被认为是预编译的所以它们是重新预编译。我用一个编程设置的BUNDLE_GEMFILE环境变量实现了这一点,该变量指向一个完全独立的gemfile,它使用MRI Ruby和NodeJS代替JRuby和therubyrhino。

答案 1 :(得分:0)

我对digitalocean上最便宜的Droplet有类似的问题。我创建了linux swap分区。 也许你的主要主机没有交换分区。