c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Scrapbox で公表中です。

Programming は GitHub で開發中です。

node.jsでChild Processと大量のdataをやりとりする問題

Node.js Advent Calendar 2013 11日目です。昨日はnazomikanさんのjadeを知る - 株式会社ネクスト エンジニアBlogでした。
さっちゃんはHamlよりもERB (erubis) を使い、SassよりもScssを使ふ人間ですが、node.jsではいちおうjadeです。あ、此れがjade + lessで書いてます。


Node.jsの問題点、デメリットと解決方法まとめ - Qiita [キータ]でわたしのnode.jsでCPUを使う重い処理のlibrary (child process使い) を1 fileで作るが取り上げられてゐるが、わたしの記事には重大な欠陥が有り、書いた直後に気附いたにも関らず修正してゐません。

  1. dataの変換
  2. 送信時間

送受信するdata量が多い場合に問題に成ります。node.jsのChild Processに限らず、Web WorkerやFlashとのやりとりでも或る程度は同じ筈です。

dataの変換

child_process.send(message, [sendHandle]) はsocketを送る事もできて、其の時はいいですが、messageとしてobjectを送るときは、其のobjectは文字列に変換されて送信されます。文字列として送られます。此れはdata量が多い場合に問題に成り得ます。高速化しやうと思ってTypedArrayとか使ってると、TypedArray -> Array -> Stringの変換に凄く時間が掛かって、Arrayで計算してるのよりも遅く成ったりします。
必ず。実測しませう。

送信時間

送受信に時間が掛かると云ふ話しではありません。まあ其れも有るので、其の計算が洞れ丈CPUをblockingしてゐるのかは実測しませう。機械向けの最適化に、論理の正確な実測は必須です。programming言語は人間の論理の為のものです。
ところでですね、childのnode.jsが終了するんですよ。送信が終わる前に終了して、parentがdataを受け取れないんですよ。此れは大問題です。
幾つか対処法が有ります。

  1. dataを細切れに送る。: スゴイ本末転倒感有りますが、dataを細切れに送れば或る程度は受け取れます。意外と受け取れます。一部は、矢張り送信前にchildが終了するので、dataが欠けてもいい場合は選択肢に挙がります。
  2. parentで受信終了を検知する。: childは送信後待たせて起こしっぱなしにしておいて、parantで終了を検知し、child_process.disconnect()で落とします。ちゃんとtime outも実装してください。child_process.send() でparentからchildに終了命令messageを送るのは駄目です。高頻度でerrorで落ちます。

まあMB級のdataを投げてゐたので此う成りました。生成されるdata量がまともな場合、何も困りません。普通にchild側でprocess.exit()させてあげてください。


明日はShigeki Ohtsuさんです。