«« iPhone4S → iPhone6に乗り換えて、ここまで進化したのかと感動! | 洗濯乾燥機NA-FV60B3を購入、乾燥機能はしわが目立つので、人によってはアイロンが必須かも »»

連想配列(ハッシュ)はやはり使える!

2014年11月16日

このエントリーをはてなブックマークに追加
何日たっても終わらないデータ解析ルーチンがあったので、連想配列を使うよう差し替えたら3分で完了してワロタ。


この間、退職したスタッフが以前組んだサーバープログラムを改善する事になった。

メインプログラムが生成する百万行クラスのログファイルの中から、特定の文字列を抽出し、その文字列を一意に配列へ格納し(重複)、そこから格納した各配列へ特定の処理を行うシェルスクリプトーなのだが、今や何日たってもこのプログラムが終わらないため見てみることになったのだ。

なるほど...

1. 定期処理(cron)で起動するにもかかわらず、起動直後にプロセスチェックして2重起動防止機構を入れていない。おかげでこのクソ重いプログラムが多重で起動していた。

2. ループ処理にsleep処理を入れていない。おかげで別スレッドで稼動中のメイン処理が必要なCPUリソースを奪っていた。

3. 一意の変数とするための処理にfor〜if文からなる全検索を行うアルゴリズムを使用していた。

どれもあれだが、この中では3番が一番ひどすぎる。
これは連想配列を使えばめっちゃめちゃ高速化しますぜ!

具体的には前のソースだと確かこんなかんじだった。
(言語は細かいところを思い出すのが面倒なので、俺言語です。シェルスクリプトじゃないよ。イメージで捉えてください)

for $i = 0 to count($ログから抜き出した一意候補の配列); do
  $check = 0
  for $j = 0 to count($確定した一意の配列); do
     if $ログから抜き出した一意候補の配列[$i] == $確定した一意の配列[$j] then
      $check = 1
      break
    end if
  done
  if $check == 1 then
    continue
  end if
  $確定した一意の配列[] = $ログから抜き出した一意候補の配列[$i]
done

これでは、ループし過ぎで時間がかかりすぎるため、こんな感じにしたと言うのが今回の話です。

for $i in $ログから抜き出した一意候補の配列; do
  $確定した一意の連想配列[$i] = 1
  usleep 1000
done

直してみたところーusleepを追加しても処理がたった3分程度で完了してワロタ。
やっぱり大量データから検索する場合は、連想配列を忘れちゃいかんね!

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
ブルース ブリン
ソフトバンククリエイティブ
売り上げランキング: 4,023

投稿者 kuze : 2014年11月16日 14:29


■このエントリーに関連した記事

■「実用ソフト&サイト」カテゴリの最新記事

«« iPhone4S → iPhone6に乗り換えて、ここまで進化したのかと感動! | 洗濯乾燥機NA-FV60B3を購入、乾燥機能はしわが目立つので、人によってはアイロンが必須かも »»


自己紹介
PHPやVBによるコーディングやシステムエンジニアを仕事にしています。
主にiPhoneアプリの紹介やWeb開発などのPC系の話題と、アニメやゲームなどのサブカルな話題を取り扱っています。

[PR]

instagram

カテゴリ

最近のエントリー

最近掲載した画像
  • Surface go購入しました、ちょっとしたコードを弄ったりお絵かきに期待!
  • Surface go購入しました、ちょっとしたコードを弄ったりお絵かきに期待!
  • Surface go購入しました、ちょっとしたコードを弄ったりお絵かきに期待!
  • JAPANGLEの特撮爆破と、はりきり体育ノ介の博士オーバーアクションが見応えあり
  • Super Audio CDはクソ、(最近の)Macで再生できねー!
  • 未来のミライはタイトル&予告編詐欺だった(ネタバレ)
  • 未来のミライはタイトル&予告編詐欺だった(ネタバレ)
  • 先日ドメインとサーバーを引っ越しました
  • 富士山でお鉢巡りをしてきた
  • 富士山でお鉢巡りをしてきた
  • 富士山でお鉢巡りをしてきた
  • 富士山でお鉢巡りをしてきた
  • ニンジャバットマンはとにかくクドい熱血系お馬鹿映画だった(褒め言葉・ネタバレ)

RSS
更新情報はRSSをご利用下さい