将大型数据文件打包在ruby gem中

时间:2015-10-13 20:05:33

标签: ruby rubygems

我试图打包一个依赖于大型关系引用源的gem,目前实现为2.1GB的sqlite数据库文件。我已将文件放在/ data目录中,并将其恰当地包含在gemspec中。 gem build工作正常(虽然压缩自己需要半个小时!),但gem install出错:

ERROR:  While executing gem ... (RangeError)
    integer 2243380224 too big to convert to `int'

如果我没有注意到2243380224是数据库的确切文件大小,那将是完全神秘的。但是,了解错误的原因并不能使我更接近解决方案。

在目前的情况下,要求用户单独下载数据库并在其项目配置中指定它是没有意义的。我希望gem install能够提供开箱即用的功能。关于打包依赖于挖掘大型信息库的ruby功能的最佳实践应该是什么建议?

1 个答案:

答案 0 :(得分:0)

我怀疑错误来自于line,其中rubygems尝试从tar存档读取条目(gem基本上是tar存档)。

它不仅试图一次性读入内存,而且红宝石的IO.read要求它的第一个参数适合签名长(不确定这是记录在案,但它肯定是MRI所做的)。在许多常见平台上,这意味着一个32位有符号整数,最大值为2 ** 31-1,小于sqlite文件的大小。

如果没有修补rubygems本身,你将无法安装此gem。此外,由于它在内存中执行所有操作(因为它期望文件很小),因此可能会遇到内存分配问题。

gem可以有一个post安装消息,您可以使用它来提示用户运行您的下载脚本,但是您无法自动运行脚本(除非您滥用extconf.rb)。当您的gem的次要代码更改不需要他们重新下载2GB数据文件时,您的用户可能会感谢您。