2016-01-22 51 views
0

我使用Ruby 2.2.3Rails 4.2.3。我用下面的代碼獲得一個NoMemoryError: failed to allocate memoryIRB控制檯:NoMemoryError:未能使用BigDecimal .to_s方法分配內存

# 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

+0

你的問題是? – sawa

回答

1

事實上,你內存不足並不奇怪。數字123e+1000000000000000000有一個零點。將其表示爲一個字符串將需要一個十進制字符。

在每個字符一個字節,你看(大約)10^18字節,10^15千字節,兆10^12,或10^9千兆字節。所以除非你擁有10億GB的內存,否則它不會那麼好。

一旦傳遞給BigDecimal構造遍數,可以在系統中所代表的人數最多,它會溢出到恆BigDecimal::INFINITY,當其轉換爲一個字符串,只是Infinity,並且可以清楚地存放在內存:

BigDecimal('123e+1000000000000000000000000000000000') == BigDecimal::INFINITY 
#=> true 
0

爲什麼不把它轉換成浮動?這適用於我:

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

好吧,你的權利。但是,to_s應該在任何情況下工作。 – phlegx

+0

@phlegx你是什麼意思的「應該工作」?如果你的計算機沒有足夠的內存來分配這個字符串,那麼......也許很好,它不會嘗試 –