AOBA's Information Processing Education
1998/05/24
注意1:このページは、回線を切断した後でゆっくりご覧になってください(テキストを印刷する場合は、その取り扱いに注意してくださるようお願いします)。
注意2:背景が白地の画面を長時間見つめていると頭が痛くなってしまいますので、ここは背景をグレーにしています。
あるチェーン店で、商品の売り上げがあるたびに、それを記録に残す(コンピュータ)システムを作成するとします。商品の売り上げは1日に何回も発生しますので、記録する売上情報の量も大きなものになることは容易に予想されます。
こういった場合、売上情報をファイルに記録すると後々便利です(ファイルとして残すことにより、このファイルを入力とする各種のシステムへの展開が可能になる)。(注)以下、ファイルといった場合は、コンピュータシステムにおけるファイルを意味します。
ここで、売上情報として記録すべきデータの情報要素を考えてみましょう。もちろん、作成するシステムによって記録すべき情報要素は異なりますが、ここでは最低限のデータと仮定します(本項は、情報要素の種類が問題でない)。
まずは店舗名でしょうか(チェーン店ですから)。
次は売上年月日です。本来ならば何時何分に売り上げたかも記録すると思いますが、これは省略します。
もちろん、売り上げた商品名と売上数量を記録に残しておかなければなりません。以上4項目をファイルに記録することにします。
「売り上げ例」
A店 1998年5月24日 商品X 2
A店 1998年5月24日 商品Y 1
A店 1998年5月25日 商品Z 3
B店 1998年5月24日 商品Z 1
B店 1998年5月25日 商品X 3上記例はA店とB店における、1998年5月24日と25日の売り上げ例です(もちろん実際は、このデータは数百〜数万件発生するはずですが、とりあえず5件だけ)。
ファイルで考える前に、上記の売上データを紙に書いて記録すると考えてください。この場合、誰でも「売り上げ例」にあるように、情報要素に特定の順番を与え(例では、店舗名,売上年月日,商品名,売上数量の順)、さらに1件ごとに行替えを行うでしょう。無意識のうちに、後々の見やすさを考えてそう記入するはずです。ファイルに記録する場合もまったく同じように考えます。
もしファイルから何件かのデータを読み出した時、1件目のデータは店舗名,売上年月日,商品名,売上数量で記録され、2件目のデータが商品名,売上数量,店舗名,売上年月日の順というようにバラバラならば、これを処理するプログラムはかなり複雑な処理を行わなければなりません。また、ある時は読み出したデータが売上1分件の情報を持ち、またある時は売上2件分の情報を持っていた場合も、同じように複雑なプログラムを作らなければなりません。
そこでファイルに記録する場合は、ある特定の情報要素の順序で、意味的にまとまった単位で記録します。この単位のことをレコードといいます。
たとえば、上記の「売り上げ例」では以下の5件の売上レコードにします。
![]()
上図で、店舗名,売上年月日,商品名,売上数量などの情報要素ごとに区切っていますが、この区切った単位をデータ項目(またはフィールド)といいます。すると、レコードはデータ項目の集まりである、ということもできます。
(注1)上図でデータ項目は縦線で区切って表現していますが、当然ながら実際のファイル内のレコードに、このような区切り線はありません。
(注2)年月日のデータ項目は、”年”,”月”,”日”の文字を省略していることに注目してください。これは(常に同じ内容なので)あってもなくてもよいのですが、なくてもよい情報ならば、普通は記憶容量の節約の意味で省略します。ただし”19”は絶対に省略しないように...(2000年問題)。ここまでは感覚的に理解できると思いますが、(レコードを扱う)プログラムを作成したことがない方は、ここからの説明はちょっと理解しがたいかもしれません(我慢してください)。
まず覚えてほしいのは、プログラムの中からファイルに対して1回の入力命令を発すると、ファイルからきっかり1レコードの内容を読込むことです(読込み先は自分のプログラムのデータ領域)。そしてファイルに対して1回の出力命令を発すると、1レコードの内容をファイルに書込みます(出力元は自分のプログラムのデータ領域)。
データ項目の順序やレコードの単位は、プログラマが自由に決めることができます。このようにプログラマが定義したレコードを論理レコードと言います。ここまでの説明はすべて論理レコードの説明でした。(注)プログラム言語や入出力命令によって、必ずしも1レコードの入出力を行うとは限りませんが、ここではそれを無視します。
論理レコードに対する用語に物理レコードがあります。
物理レコード(またはブロック)とは、OSがファイルに対して1回に入出力する単位です。つまり、OSが1回の入出力命令で入出力を行うレコードが物理レコードです。(注)これまで単に”プログラム”と呼んでいたものを、ここからはOSと区別する意味で”応用プログラム”と呼ぶことにします(OSだってプログラムですから)。
応用プログラムは(普通は)それ単独では動作しません。その下にOSがあって初めて動作が可能になります。実はこの場合、応用プログラムから入出力命令を発しても、必ずしもファイルに対して入出力するとは限りません。
この点についてちょっと補足しましょう。ファイルの入出力動作に要する時間は、他のメモリやレジスタの動作と比べて圧倒的に低速です。まさに桁違いに遅いのです。だからファイルに対して入出力する回数は出来るだけ押さえたいでしょう(そうすると処理速度が速くなるから)。
一方、応用プログラムを作成するプログラマから見ると、「1回の入出力命令を発すると、その都度1件のレコードが入出力される」と考えると、プログラムがとても簡単になります。
そこでOSの出番です。OSが応用プログラムから入力命令を受取ったとします(入出力命令は普通はOSが処理する)。そこでOSはファイルから1件の物理レコードを読込みますが、この1件の物理レコードに、(普通は)数件の論理レコードが含まれます。そしてOSは、応用プログラムに最初の1件の論理レコードだけを渡します。だから次に応用プログラムから入力命令を受取った場合は、すでに読込まれている物理レコードの中から、次の論理レコードを切り取って応用プログラムに渡すことができます。
このようにして何回か応用プログラムに論理レコードを渡して、渡すべき論理レコードがなくなった時に、OSはファイルから次の物理レコードを読込みます。
今は入力の例で説明しましたが、出力の場合も同じような感じで処理されます。最後に、ブロック化係数という用語も覚えておいてください。
ブロック化係数(ブロック化因数,ブロッキングファクタ,BF)とは、1つの物理レコードに含まれる論理レコードの数です。たまにブロック化係数が1のレコードもありますが(つまり、論理レコード=物理レコード)、このレコードを非ブロック化レコードと言います(非ブロック化レコードに対して、ブロック化係数が2のレコードをブロック化レコードと呼ぶ場合もあります)。
以下の図はブロック化係数が4のブロック化レコード(1ファイルに12件の論理レコード)の例です。
![]()
以上、今週はレコードについていくつか説明しました。
ではまた来週。