考慮してください: データを生成するオブジェクトの多数のインスタンス。実行ごとに 1 回だけそのデータを生成するのは素晴らしいことです。
class HighOfNPeriods < Indicator
def generate_data
@indicator_data = DataStream.new
(0..@source_data.data.count - 1).each do |i|
if i < @params[:n_days]
...
@indicator_data.add one_data
end
end
HighOfNPeriods
with differentparams
と differentの異なるインスタンスがあります@source_data
。
インジケーターの使用方法は次のとおりです。
class Strategy
attr_accessor :indicators
def initialize params
...
end
メソッドHighOfNPeriods.generate_data
は 内から呼び出されますStrategy
。それぞれStrategy
が の新しいインスタンスを取得するHighOfNPeriods
ため、ある種のグローバル値としてそれを引き出すことはできません。それに加えて、それはグローバルであってはなりません。
unless @indicator_data
の多くのインスタンス間でデータを共有する必要があるため、機能しませんHighOfNPeriods
。
したがって、質問は次のとおりです。
What is a good way to memoize the instance variable `indicator_data`
or the object `HighOfNPeriods` when there are many different instances,
some of which have different data?
解決策の 1 つは、ActiveRecord を使用してデータを保存することですが、現時点では、次の理由から、それは実際にはやりたくない方法です。
- パラメータの順列が多すぎるため、すべての生成データを事前に生成できるわけではありません。以前に生成されたかどうかを確認し、必要に応じて生成 (および保存) する方が理にかなっています。
- データの生成にそれほど時間はかかりません。一度生成され、実行ごとに何百回も使用される場合があります。
- データベースからデータを取得するよりも、オブジェクト内からデータにアクセスする方が高速です。
ルビー1.9.3