ここには 1998 年度の IS 研究科 N 専攻のデータベース学演習で用いた資 料があります.利用は御自由ですが,この資料を利用する場合には御自分の責 任で行なって下さい.この資料によって生じたいかなる損害についても山内は 責任を負いません.御意見,御提案などについては歓迎いたします.
Copyright (C) 1998 YAMAUCHI Hitoshi 山内 斉
この演習ではデータベースと関係の深いデータ構造とアルゴリズムについ ての話題をとりあげました.解答例については御相談下されば対処するかもし れません.
関根 5648 伊藤(秀) 5630 山内 5638 岡本(秀) 5636 阪口 5646 出澤 5645 神原 5463 弓場 5640 前田 5637 福田 5263 韓 5625 小嶋 5627 佐藤 5643 長岡 5626 土屋 5632 曽和 5635 藤田 5647 本多 5641 小菅 5238 中村(整) 5451 弓場 5640 陳 5631
ハッシュ表を作成し,データを挿入するプログラムを作成し,ソースコー ドと共にレポートを提出すること.ソースコードはレポートのみならず, E-mailでの提出も行うこと.締切は 11/25 日のこの時間とする.課題名は 「ハッシュ表の作成」とする.
今回の課題では,GNU GENERAL PUBLIC LICENSE をファイルから読み込み,各単語の数を数えよ.このファイルはここから持っていくこと.レポートには単語とその頻度の上 位 20 位までを示すこと.ただし,単語数の頻度別ソートは,作成したプログ ラムの結果から sort などのプログラムを利用して整列してもよい.ソート部 分をプログラミングする必要はない.
/** * Random Number Generator Copyright (C) 1998 YAMAUCHI Hitoshi 山内 斉 * @author YAMAUCHI Hitoshi 山内 斉 */ import java.io.*; import java.util.*; class RandomGen { public static void main(String [] arg) { Random r = new Random(1234); for(int i = 0; i < 1000; i++) { System.out.println(Math.abs(r.nextInt()) % 10000); } } }本来は問題に書くものでないのかもしれないが,この問題の意図は外部ソート を行うことである.したがって,主記憶に入りきらない場合でもソートが可能 であることを実験して欲しい,そこで,たとえば最初の 1000 要素をシーケン シャルに読み, 250要素の 4 つのファイルにする.その後,内部で 250 要素 のソートをマージソートで行う(あくまでマージソートして欲しい)のも良いし, あるいは本当に 1000 要素のファイルまで分解しても良い.
前準備として PostgreSQL などの SQL の利用可能なデータベースを触れる 環境を用意する.(自分で install しても良いし,既にある環境を利用するな ども可.以下の実験を行えば良い.) 今回はソースが不要なので E-mail での 提出は行わなくて良い.
PostgreSQL のソースは次の場所にある.
課題今回の演習課題は 2 phase lock の実装を行う.どのような方法をとって も良いが,shell script を用いる方法が簡単であろう.Unix 系の OS では mkdir,ln などの動作が不可分で行なわれるものがある.あるいは lockf を 使うという方法もある.perl は flock を用いることで lock を行うことが可 能である.
簡単な lock の動作は次の図 1 のようにして確認できるだろう (Unix Magazine 1998/11 多治見 寿和,ファイルのロックを参照).このファイルを lock.sh として
lock.sh & lock.sh & lock.sh
のように起動する.この場合には図中の -f と touch が不可分な命令でな いためにcritical section に同時にいくつものプロセスが入ることができる. 上手くいかない場合には,touch の前に sleep 1 などを入れて不可分性をさ らに高めてやれば良い.
#!/bin/sh LOCK=/tmp/lock # lock file : 存在したら lock 中 while [ -f $LOCK] ; do :; done touch $LOCK echo "Here is in critical section (PID = $$)" sleep 3 rm -f $LOCK echo "Here is out of critical section (PID = $$)" exit 0
図 1 正しくない lock のかけ方
課題