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