回答箱 No.96-1:  検索速度を速める方法は?

  ◆ 質問箱 No.96  質問者:   藤原 良允  1999年05月 208号 P.29
      ◆ 質問箱 目次へ
No.96-1   検索速度を速める方法は? 回答者
   早瀬 壮一
1999年06月
209号 P.30
   ◆ No.96(1999 05月号)の回答-01
   CP/MというOSはデータ管理方式が単純だから、必要なチータにアクセスするには、ディレクトリーを見に行けばすぐデータのディスク住所を調べることは出来ますが、データを探しに行くときは、いちいちディレクトリーを読みに行かないといけません。
   これがインデックスのスピードを抑える働きをしたり・CSのスピードを抑える働きをしています。
   ソードが無くなったいま思い起こすことはソード華やかなりし時代です。
   当時ソードのOSはKDOS,RMDOSがありました、今から思うとこのDOSは大変よくできたOSだったのですねー。当時「いんふぉーとぴあ」で「CP/M論争」がありました。ソード側はCP/Mは不合理なデイスク管理をしているからスピードが遅いことなどを上げ、それに対して、KDOSは合理的なディスク管理をしていることを強調していました。今から思うとソードはい仕事をしていたのですねー。当時はMS-DOSはまだ出来ておらず、OSといえばCP/Mだけでした。
   そのソードが日本語PIPSから、CP/M-68Kを使うよっになりました。
   私はスーパーPIPSで最初に大掛かりなシステムを作ったのは、支店を4つ持つオートバイ屋さんでした。そこではそれまで、日本語PIPSで顧客管理をしていました。オートバイを1台売ると、そのオートバイの買い手の情報を記録するシステムです。
   そしてDM発行や顧客情報を取り出すのはその累積データからでした。当時でも300ぺージほどの顧客ファイルで、機械はM68MX。OSはCP/M-68K。今でも忘れません。そのスピードの遅いこと。インデックスの更新で数時間使ったことを思いだします。私がインデックスを早くするテクニックを色々試し、CP/Mのディスク管理を理解したのはその苦い経験の中からです。
   日本語PIPSと違ってバインダー管理をするスーパーPIPSはCSも遅かったです。
   それを改善する方法を考えたのがページ管理方式でした。

   年月でページ管理をする   

   右のようなページ管理のバインダーを用意します。
   このバインダーは年月とページ数を登録するようにしています。インデックスをPGとでもしておきます。キーは@YYMM、データは@P、1ぺージの桁数を36桁にすれば390行ものファイルが出来ます。必要な年月はほとんどカバーできます。ページのところは999などと最高の数字を入れて置きます。
   売上を立てるとき顧客ファイルのバインダーページを調べておきます。
   入力し終わって顧客ファイルに登録するとき、ページ管理のバインダーのその年月のページ欄を調べ、そのページが今読み込んでいる顧客ファイルのページ数より大きいか小さいかを見て、ページ管理のページ数が小さければそれを更新せず、大きければ顧客ファイルのバインダーページ数を登録します。つまり、同年月のページを記録するとき、ページが小さくなるようにしておきます。

   検索するときは、検索対象を「顧客ファイル/M,N」と開始ページ,バインダー最終ページと指定します。従って、いつも作業開始時に検索対象のバインダーページ数「N」を見なければなりません。検索対象を何時からという年月日を受け取ったら、その年月でページ 管理のインデックスを読み、ページ数を取ります。そのページ数が場合によっては顧客ファイルのバインダーページ数よりも大きいことがあるかも知れません。そういうときは仕方がないから1ページから検索することにします。ページ数が顧客ファイルよりも小さいときはそこから数ページ差し引いて(この幅は実際にテストしてそのシステムに最適な数値を求めておく)それが1より大きければそれを検索開始のページ「M」にします。
      こうして
         CS;顧客ファイル/M,N;検索条件…
   という書式で検索すれぱ検索時間を合理的に使うことができます。

      /*------ 頁管理書き込み-----*/
      IUSE "PG";
      LET X17=BINDETR("顧客マスター"); /* 顧客マスターのバインダーページ数*/
      G/F;顧客マスター/E;DR;A;;IR;;H;;最大売上日を書き込む表作成 */
      CAL;C[@円売土日 ];TMAX"顧客マスター/E" (C)=RT;LET V8=[T,@売上日 ];
      LET V9=LEFT$(V8,6);ISEARCH "PG",V9;IF ERR(0)<> THEN GOTO $NX;
      IREAD "PG",V10=@P ;IF V10<>"999" THEN GOTO %NX;
      LET X10=IVAL(V10);IF X17>=X10 THEN GOTO %NX;1WRITE "PG",@P =NUM$(X17);
      $NX:  IEND "PG";


      /*------ 検索実行 ------ */
      /* 検索開始年月日 … Z1  */
      LET X2=BINDER("顧客マスター");    /* バインダー最終ページ */
      LET Vl1=NUM$(INT(Z1/100);           /* 年月  */
      RINDEX "PG",V11,V21=@P;            /*ページ管理ファイルのページ数を読む */
      LE TX1=INTG(V21)-5;IF X1< | >X2 THEN LET X1=1;
      /* それより5を引き、それが1より小さくなるかバインダーページ数よりも大き */
      /* いときは1ページから検索する(エラー回避処理)・・・・・・・・・*/
      /* 検索実行 */
      CS顧客マスター/%X1,%X2;検索条件…
   ThePIPSになっても、FT-32などCP/M-68Kの下では、スピードが遅い のでこれは必凄でしたが、DOS/VやWindowsのThePIPSでは、もう必要なくなりましたので今は使っていません。
戻る