精密な演算結果を要求されない場合の分散処理について考えてみる

公開日: : 最終更新日: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について調べてみる。

関連記事

サンフランシスコのピア39にあるチャウダーズでクラムチャウダーを食す!

アップルの開発者向けイベント「WWDC2014」に参加するため

ミスドのカルピスドーナツとカルピスポンデリングを食べてみた!

ミスドで期間限定のカルピスコラボ商品「カルピスドーナツ」と「カルピ

十三カレー計画で牛すじカレーネギのせを食す!(大阪・十三)

「iPhoneアプリ開発キャンプ@大阪」のランチで、十三カレー計画

大阪・難波の加寿屋 法善寺でかすうどんを食す。ランチタイムはおにぎり2個まで無料!

大阪・難波の加寿屋 法善寺 (かすうどん KASUYA)で、かす

ライブドアブログで運営していた「あきお商店」を「卵は世界である」に改名しました

少し前からライブドアブログで「あきお商店」というブログをやって

→もっと見る

PAGE TOP ↑