2016-06-24 5 views
0

私は約3百万のレコードを含むことができるファイルを持っています。このファイルの特定のレコードは、プログラムの実行中に複数回更新する必要があります。私は、より効率的である以下のどの、このファイルから特定のレコードをプルする必要がある場合:COBOL検索とVSAM検索VS COBOL検索/ループ

  1. インデックス付きVSAM検索
  2. インデックスフラットファイルのすべての
  3. バッファリングデータのすべての作業領域にホストシステムは、ページのワーキング・セットをサポートすることができます場合は、メモリ(およびにすべてのデータをバッファリングすることができれば、明らかに検索
+2

あなたはすでに2つの答えにいくつかの良いアドバイスがあります。しかし、十分な詳細がないので、あなたの質問に対する特定の答えは不明です。同じバッチプログラムから同じKSDSレコードを複数回更新することは珍しいことです。両方のデータセットを同じキー順に並べ、「ステップ内で」読むことができる「2ファイル一致」がありません。あなたのKSDS全体でかなり低いレベルの「ヒット」で(これは更新がなくても)これが行く方法かもしれません。しかし、...あなたのデータを知っていることは不可欠です。悪いコード/悪い考えが通常のパフォーマンスの問題です。 –

答えて

5

を処理するためのループを書きますそれはすべてがに実際にがページングせずにRAMに残るようにするのに十分な大きさですが、これはおそらく最も速いアプローチです。

ただし、仮想メモリページングサブシステムによって引き起こされる「隠しディスクI/O」については、十分注意してください。要求されたメモリ内のデータが実際にでない場合は、メモリ内にページ違反が発生し、ページが取得されるまでプロセスがトラック内で停止します。 (「ページスチール」が発生した場合は、うまくいきませんが、あなたの「メモリ内」戦略は、非常に非効率な(!)ディスクベースの戦略に変わっただけです。巨大なワーキングセットそれがランダムににアクセスしていること。は、そのメモリのすべて場合は、実際メモリ内ではなく、あなたが困っている。

更新を行っている場合は、そこにに滞在します大きなファイルに変更する場合は、を処理する前にupdates-deltaファイルをソートして、同じキーのすべての出現が隣接するようにします。これでCOBOLプログラムを作成してを利用できるようになりました。(もちろん、シーケンス外のレコードが検出された場合はabendになります)。 "this"レコードのキーが "previous"キーのキーと同じ場合は、レコードを再読み込みする必要はありません。 (実際には、には、キーが変更されるまで、古いレコードであるを書き込む必要はありません)。インデックス付きファイルのアクセス方法はキーの連続で表されるため、各キーはそのキーの「近く」既に要求されているので、必要な索引ツリー・ページのいくつかはすでにメモリー内にあるでしょう。明らかにこれをベンチマークする必要がありますが、ファイルのソートに費やされる時間は、索引検索に費やされる時間よりはるかに短くなる可能性があります。 (どの実際にかなりのことができます。)

+0

z/OS(OPで使用されているOS)については、「ページ固定」を可能にするシステムサービスがあります。明らかに、これは「感覚的に」(論理的または物理的に「キー」な順序で)使用されるだけです。これは、COBOLプログラムからの単純な呼び出しです。それが理論です。練習は "技術者に知らせないでそれをしないでください"です。しかし、可能です。 –

4

マイクの答えは(マシン、コンフィグレーション、データの量によって異なります)の「隠されたI/O」についての重要な問題を持っている...

はあなたの場合は非常におそらく多くのレコードを更新する必要があります.Mykeが提案するオプションは最も有用なものです。

多くのレコードを更新する必要がない場合は、別のアプローチがかなり速くなる可能性があります(ベンチマークが必要です)。):

  • あなたが唯一のいくつかの値とレコードを変更する場合は、メモリ内のインデックス付きVSAM検索
  • ストア変更されたレコードを経由してすべてのキーを(大きなテーブルを発生する)読みがかなり大きいですのみ可能なすべての変更された値を保存しますVSAM検索を行う前に、実際のREWRITE
  • のないテーブルで+キー:あなたはすでにキー を読めば、テーブルを発生し、あなたに見て、そこからか、新しい
  • を得るのいずれかの値を取る...
  • プログラム終了時に
  • :あなたを通過「あなたのデータと可能なプログラムの流れを知っている:rは

パフォーマンスがしばしばある(あなたは、REWRITEが十分にある完全な記録を持っている場合、そうでなければ、完全なレコードを取得するためにREAD最初に必要があると思います)すべてのレコードを発生し、REQRITEベスト2-3のアプローチを試し、ベンチマークして決定してください。

関連する問題