- 締切済み
汎用機COBOLのメモリ管理について
汎用機COBOLのオンラインPGですが、明細データをDBから読み込んで、配列に入れていますが、99%は300件以下です。1%は300件以上ですが、その場合1000件以上になります。そこで、通常は300の配列で処理をし、300件を超えたら1100の配列で処理をする様にして、メモリの使用を抑えようとしています。この場合、可変長配列を使用すれば、何の問題も無いのですが、自分が配属された時には、2つの固定長配列のCOPY句を使用して、目的を達成しようとしていました。方法は、 (1)配列300のCOPY句をワークエリアに、配列1100のCOPY句をリンケージエリアに配置する。リンケージエリアにCOPY句を配置する理由は、何もしなければ、メモリを消費しないからです。 (2)配列300のワークエリアを初期化して、そのアドレスをリンケージエリアの配列1100にセットする。この時点では、ワークエリアとリンケージエリアで配列300分のメモリアドレスを共有する。 (3)共通サブルーチンに(2)のアドレスを渡し、明細を取り込む。1100を超えた場合は、アドレスを取り直して、返却する。 (4)メインPG側で、返却されたアドレスをリンケージエリアの配列1100のエリアにセットし直す。 (5)判定や計算をする場合は、リンケージエリアの配列1100の項目名を使用する。 以上が、大まかな処理の流れです。 そこで、疑問なのが明細が300件未満の場合です。使用しているメモリの場所は、ワークエリアの配列300とリンケージエリアの配列1100とは、同じワークエリアのメモリアドレスになるので、どちらのCOPY句で処理しても、同じ結果になります。この時、配列300分のメモリしか使用していない事になっていますが、判定や計算には配列1100の項目名を使用しています。そこで疑問なのは、アドレスセットだけなら問題無いにしても、配列1100の項目を処理に使用した時点で、配列1100分のメモリが確保されてしまうのではないかという事です。つまり、節約しているつもりが、配列1400分のメモリを浪費しているのではないかという疑問です。配列300の場合と配列1100の場合とで、PGを完全に二重化すれば問題は無いとおもいますが、メーカーの担当エンジニアは問題無いと言っているのですが、誤解が有るような気がしてなりません。どなたか、解る方がいらっしゃいましたら、ご教示頂けると幸いです。どうぞよろしくお願い致します。
- みんなの回答 (9)
- 専門家の回答
みんなの回答
- paradigm170614a
- ベストアンサー率0% (0/0)
関連するQ&A
- COBOL・全角判定
以前こちらで質問したものです。 http://oshiete1.goo.ne.jp/qa2553484.html 例題を参考に詳細設計書を作成中ですが、 お客様の要望で「漢字項目は前後に漢字制御コード(前に‘0A42’後に‘0A41’)を付加する」というのがあり、わからなくなってしまい質問です。 漢字項目もX(40)というようにCOPY句で設定されています。 どの項目が漢字項目なのかは資料をいただいてわかっています。 例題をもとにすると IF DATA-AREA NOT = ' ' PERFORM TEST BEFORE VARYING I FROM DATA-LEN BY -1 UNTIL (I < 1) OR (DATA-AREA(I:1) NOT = ' ') CONTINUE END-PERFORM 【1】 MOVE I TO DATA-LEN STRING DATA-AREA ',' DELIMITED SIZE INTO OUT-REC WITH POINTER DATA-POS END-STRING 【1】にIF文でデータが全角かどうか判定するのだと思うのですが どう判定したらよいのでしょうか。マニュアルをみたのですが探せませんでした。またもし全角データだった場合STRINGはどのように記入すればよいのでしょうか。
- ベストアンサー
- その他(プログラミング・開発)
- メモリの増加に関して
static 変数にて 大きな配列を取得し、その配列の任意の位置(サンプルでは4k毎) に値を入れた場合、 タスクマネージャのプロセスでメモリ使用量を確認した場合、ステップ実行毎にメモリが増えて行くように見受けられます。 本来C言語なら 実行時にリニアにメモリを取得するとの認識ですが、拡張子がcpp だからか、windows環境だからなのか? 色々と理解できません。 また、4k毎と記載しておりますが、どうも4k毎にメモリを取得しているように見受けられるためにその様に記載いたしました。 しかしメモリダンプで見た場合、リニアに見えていることを考慮すると。 空間的には指定のサイズ分リニアなメモリを用意する(他のメモリとはオーバーラップしない) 使用時に実使用メモリとして管理(カウント)する。 等の動きをしているのでしょうか? メモリダンプでアドレスをずらしながら確認すると使用メモリの増加が確認できております。 ファイル拡張子をcに変更して、プリプロセッサの設定を変更しても同じ現象の確認が取れました。 大きなメモリを使うのだからmallocを、、、は 今回は無しでお願いします。 純粋になぜこのような動きになっているかを知りたいと思っております。 よろしくお願いします。 OS XP SP3 開発環境 VC2005 ファイル拡張子 cpp コンソールアプリ /***************************************/ #include "stdafx.h" #define WORK_STATIC_MOMOERY_SZ ( 10 * 1024 * 1024 ) static char work_static_momory[WORK_STATIC_MOMOERY_SZ]; int _tmain(int argc, _TCHAR* argv[]) { work_static_momory[0] = 0x12; work_static_momory[ 4 * 1024 ] = 0x12; work_static_momory[ 8 * 1024 ] = 0x12; work_static_momory[12 * 1024 ] = 0x12; work_static_momory[16 * 1024 ] = 0x12; return 0; }
- ベストアンサー
- C・C++・C#
- ファイルから構造体へデータを格納(動的メモリ割り当て)
C言語の勉強をしいております。 typedef struct address { char names[32]; /* 名前 */ char tels[32]; /* 電話番号 */ struct address *prev; /* 前のリスト */ struct address *next; /* 次のリスト */ }Address; という構造体へ、ファイルから読み込んだテキストデータ(名前と電話番号がTABで区切られている)を格納したいのですが、配列ではなく、動的にメモリを確保しながら格納する方法を教えていただけないでしょうか? 処理の流れとしては、 ・1つめの構造体の*prevにはnullを入れておく。 ・1つめの構造体へファイルの1件目のデータを格納する。 ・ファイルのデータがまだある場合には、malloc関数を使ってメモリを確保し、malloc関数からの戻り値を1つめの構造体の*nextへ格納する。 ・構造体へ2件目のデータを格納する。 このような感じだろうという程度しか分からず、ソースも書けずにいます・・・。 配列を使用したサンプルはあるんですが、動的に処理を行う方法を教えていただけないでしょうか? よろしくお願いいたします。
- 締切済み
- C・C++・C#
- COBOL97,Power-COBOLでの効率の良い書き方
汎用機のCOBOLでは添字にはCOMP-1を使うと効率が良いとか、ベースレジスタ削減のために 01レベルのワーク領域の数を減らす(少数の01レベルの配下にワーク領域を定義する)などがマニュアルに記載されていました。 ところがパソコン/サーバ上で動くCOBOLの場合は、計算用にCOMP-3を使うと処理効率が悪い、計算用ではCOMP-3よりはDISPLAY項目、さらに良いのはCOMP-5である、などと言う記事もあり汎用機COBOLとはずいぶん違うようです。実際のところ、パソコン/サーバ上で動くCOBOLで実行時の効率が良いプログラムを書くためには、どのような事に注意すれば良いのでしょうか?
- 締切済み
- その他(プログラミング・開発)
- メモリについて
私の使用しているPCはメモリソケットが4ケ付いています。 そこで、質問なのですが、512Mのメモリ4枚装着した場合と1GBのメモリ2枚の場合と、処理能力に差が出ますか? メモリの枚数によって処理能力に差が出る事はあるのですか? お解りになる方教えて下さい。
- 締切済み
- その他(PCパーツ・周辺機器)
- COBOLの動的SQLについて
COBOLにおいて、動的にSQLを組みたいのですが、 取得する方法も含めてご教授願いませんでしょうか? 例) 条件により コード=1の場合、 SELECT A.ID,B.NAME FROM ID A,NAME B コード=2の場合、 SELECT A.ID,B.NAME,C.ADDRESS FROM ID A,NAME B,ADDRESS C のように条件により取得する項目も数もテーブルも違います。 この場合でのSQLの組み方とデータを取得する(FETCHの方法)がわかりません。 また、取得する件数も1件ではありません。 よろしくお願い致します。
- 締切済み
- その他(プログラミング・開発)
- メモリの4枚使用について
PCのメモリは同じものを2つ使用したほうがいいと聞いたのですが、 スロットを4つ使う場合は4つとも同じメモリがいいのでしょうか? それとも同じのを2枚2セットで使ってもいいのでしょうか? どなたかご教授願います。
- ベストアンサー
- デスクトップPC
- realloc関数でメモリエラー
いつもお世話になります。 今、Microsoft VS 6.0 でrealloc関数を使用したプログラムを作成した所、 メモリエラーが発生してしまいました。 どうも、調査を行なっていくと、realloc関数を何回か使用していくと、 別のメモリ領域を破壊(?)しているように思えます。 そのような現象って、他の方々も発生した事があるのでしょうか?? それとも何か落とし穴が??? どなたか情報をもっている方、是非是非お願いします。 ちなみに、reallocを使用せず、malloc関数のみで作成したプログラムでは 発生してません。 ---------------- 【reallocを使用していて作成した関数】 ファイルを読み込み、1件読むたびにrealloc関数でエリア拡張 (最初の1件目はmalloc関数にてエリア確保、2件目以降realloc使用) 【原因】 ポインタ変数の内容(アドレス値)が変更されている事が発覚 →おかしくなったエリアを参照しようとしてメモリエラーが発生 ↓ 変更された個所を選定していくと、 「realloc」関数を使用後変更されている事が発覚 ※変更されていたポインタ変数は、「realloc」関数使用時には 全く参照もしていない変数で、ロジック上値を変更するような事は なかった ↓ 「realloc」関数を使用すると常に発生しているわけではない事は確認済 (たまに発生 ←メモリ領域へのアロケートなので取得するエリアによって発生すると推測) ↓ 同様のロジックを予め件数を数えた後、 「malloc」関数を使用すると発生しない事は確認済
- ベストアンサー
- オフィス系ソフト
- パソコンのメモリのこと教えて下さい!
「メモリは多ければ多いほど処理能力が向上することになります。」と書いてあるのを読んだのですが、これは間違いではないのでしょうか?使用するOSやアプリケーションによって必要なメモリが足らない場合は、スワップして処理能力が落ちてしまいますが、必要以上にメモリを増やしても処理能力は向上しないですよね。 どう思われますか?教えてください。
- ベストアンサー
- その他(PCパーツ・周辺機器)
- メモリについて
パソコンのカタログでメモリ256MB(最大2GB)と言う表示があります。どういう意味でしょうか? 初心者にわかりやすく教えて頂けると嬉しいです。 富士通の冬モデルのパソコンにビデオメモリという項目があり、その数字が大きいほど映像処理が早いと聞きました。 富士通の春モデルのカタログにはビデオメモリの項目がありません。 これはどおいう事ですか? ニューモデルにはビデオメモリが無いのですか? デジタルビデオの編集をメインの使用目的にパソコンを買いたいと考えています。 なるべく動画編集ソフトが速く動くものがいいです。 例えば富士通の冬モデルのNX90J/Tと春モデルのNX90KTを比較した場合メインメモリが同じでCPUも同じなので単純比較ではビデオメモリのある冬モデルのNX90J/Tの方が動画編集ソフトの動作が速いと考えていいのでしょうか? メモリ増設などの手を加えないで市販状態のパソコンで使用したいです。 動画編集ソフトが速く動くパソコンの選び方でCPUとメモリ以外で何か有りましたら教えて下さい。
- ベストアンサー
- ノートPC
補足
問合せ、ありがとうございます。 SET ADDRESS で、ワークエリアにアドレスを保存したものを、DISPLAYで確認しようとしましたが、何をやっても同じ文字列が表示されて、変化を確認できません。別の配列のアドレスをDISPLAYすると、配列の中身が表示されたりしますが、問題となっている配列では、意味の解らない文字列が表示されるだけです。文字列の長さは30~40文字程度だったと思います。アドレスの確認方法がお解りでしたらご教示頂けると幸いです。