使用narray 在 Ruby 中高效处理大型数值数组。
它更快,并且使用更少的内存。 http://narray.rubyforge.org/
至于DB存储部分。可以将编组添加到narray(默认情况下没有):
# This adds support for Marshal to NArray - found it at: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/194510
class NArray
def _dump *ignored
Marshal.dump :typecode => typecode, :shape => shape, :data => to_s
end
def self._load buf
h = Marshal.load buf
typecode = h[:typecode]
shape = h[:shape]
data = h[:data]
to_na data, typecode, *shape
end
end
。 . .这将非常有效,无需您编写特定代码。
如果数字是完全随机的,那么您可以通过压缩实现的效果将受到限制。真正的随机数据几乎是不可压缩的。
如果您对数字的排列方式有一个良好的约束模型,那么您可以利用这方面的知识来创建更好的压缩比。建议使用Range 的帖子就是一个极端的例子,但当然只有在结构非常简单的情况下才有效。
如果结构或多或少是任意的,只需整理数据并对其应用现成的压缩算法,例如zlib。
编辑:项目已排序的事实有助于更好地压缩。它还为narray 打勾 - 它比您使用 Ruby Array 手动执行的任何操作都更快地对数字进行排序
示例代码:
require 'narray'
require 'zlib'
# Ten thousand integers . . .
n = NArray.int(10000).random(100000).sort
# Compressed . . .
stored = Zlib::Deflate.deflate( Marshal.dump(n), 9 )
stored.length
=> 14297
这还不错,每个数字 1.5 字节(实际压缩率会有很大差异,但使用这种技术通常会看到每个数字不到 4 字节)