精密な演算結果を要求されない場合の分散処理について考えてみる
公開日:
:
最終更新日:2014/02/04
未分類
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
風呂上がりにちょいと考えごと。以下のようなコードを考えてみる。
def func1(param)
# do something
end
def func2(param)
# do something
end
result = func1(func2(param))
func1が1秒、func2が1秒かかるとしたら、この処理には約2秒かかるはず。次に、この処理をクライアントとサーバーで分散することを考える。
# client side
def func2(param)
# do something
return result
end
result = server->func1(func2(param))
# server side
def func1(param)
# do something
return result
end
server sideがclient sideの10倍高速だとすると、この処理には(約1秒 + client->server転送時間 + 約0.1秒 + server->client転送時間)だけかかる。なので、転送時間によってはすべてclient sideで処理したほうが速いかもしれない。
ここで、この処理における条件を考える。
- この処理を秒間100回ほど実行する
- paramはリアルタイムに変化する
- resultをリアルタイムに求めたい
- 精密な結果は求めない。大体合っていれば良い
「大体合っていれば良い」ので、以下のようなコードを考えた。
# client side
def forecast2(param)
# forecast result of func2
return forecast_result
end
def func2(param)
# do something
return true_result
end
result = server->forecast1(forecast2(param))
# server side
def forecast1(param)
# forecast result of func1
return forecast_result
end
def func1(param)
# do something
return true_result
end
func1とfunc2は専用のスレッドで動作していて、最新のparamを元に、常にresultを演算している。resultの履歴はメモリサイズに応じて、ある程度残しておく。func1やfunc2が呼ばれた際には、resultの履歴を元に、現時点でのresultを予測し、返す。この方式であれば、精密な結果ではないが、paramの変動が大きくなければそれなりの結果をリアルタイムに取得できるはず。paramが大幅に変動しても、func1やfunc2からの演算結果が履歴に追記されてくれば、forecast1やforecast2から返ってくるresultは、現時点での精密な演算結果を追従してくれるはず。
分かりづらいので図を書いて考えをまとめようと思ったけど、今日は寝る。
TODO
id:nyaxtのlibpolatskについて調べてみる。
関連記事
- PREV
- 関数からハッシュを返してみる
- NEXT
- 各種リテラルの型などについて実験