NoMemoryError:使用BigDecimal .to_s方法

时间:2016-01-22 17:40:00

标签: ruby-on-rails ruby out-of-memory bigdecimal

我使用 Ruby 2.2.3 Rails 4.2.3 。我在 irb 控制台中使用以下代码获得NoMemoryError: failed to allocate memory

# Using 123e+1000000000000000000
BigDecimal('123e+1000000000000000000').to_s
#=> NoMemoryError: failed to allocate memory

但这个数字越大的例子就越有效:

# Using 123e+1000000000000000000000000000000000
BigDecimal('123e+1000000000000000000000000000000000').to_s
#=> "Infinity"

这里是BigDecimal的代码:https://github.com/rails/rails/blob/v4.2.3/activesupport/lib/active_support/core_ext/big_decimal/conversions.rb

2 个答案:

答案 0 :(得分:2)

你内存不足的事实并不奇怪。数字123e+1000000000000000000有一个五分之一的零。将它表示为一个字符串将需要一个五角形字符。

每个字符一个字节,您可以查看(大致)10^18字节,10^15千字节,10^12兆字节或10^9千兆字节。因此,除非你拥有10亿GB的RAM,否则它将无法正常工作。

一旦传递给BigDecimal构造函数的数字传递了可以在系统上表示的最大数字,它将溢出到常量BigDecimal::INFINITY,当转换为字符串时,它只是{{} 1}},并且可以清楚地适应记忆:

Infinity

答案 1 :(得分:0)

为什么不将它转换为浮动?这对我有用:

BigDecimal('123e+1000000000000000000').to_f
=> Infinity