ここには 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 のかけ方
課題