プログラムのメモリの使用量

記事
IT・テクノロジー

プログラムのメモリの使用量

同じ様なデータの処理を行うプログラムでも必要なメモリの量はどの様に作るのかによって変わってきます。先日から紹介している回路設計の支援アプリでも結構変わってきます。この記事では、どの様に変わってくるか少し詳しく説明してみました。


基本的なデータの量は同じ
当たり前ですが、扱うデータが同じ場合、トータルで扱うデータ量はほぼ同じになります。 しかし、冒頭で書いたように、同じ様なデータの処理でもどの様に実装するかによって、必要なメモリ容量は変わってきます。 例えば、データがファイルにある場合、必要なデータだけをファイルから読み込んで使えば、実際にプログラムで使用するメモリの量は抑える事ができます。

データの量は変わりませんが、プログラムの実行に必要なメモリ容量は違うという一つの例です。

これはお金の話を考えるとわかりやすくなります。ある人が所有しているお金の量は例えば銀行に置いてあるお金と手元にあるお金の合計になると思います。全てのお金を持ち歩く場合、銀行から全てのお金を引き出して持ち歩く事になります。しかし、ほとんどの場合は、持っているお金(資産)を全部持って歩くケースはありません。必要な分だけを銀行から引き出してお財布に入れて持ち歩くと言うのが普通です。

プログラムでも、同じ様な考え方をする事ができます。

ネットリストのデータを全て読み込んで、その中から必要なデータを処理するという方法も取れます。しかし、必要なデータだけを読み込んで処理する事を考えると、データを置く場所(メモリ)を節約する事が可能になります。

必要なデータだけを使う方が便利?
では、もう少し具体的に回路の接続情報をネットリストから読み込んで回路設計の支援アプリを作る場合を考えてみます。

実際に必要なデータのみをネットリストから読み込んでデータの処理を行えば必要なメモリの使用量を節約できるのは、すでに上で説明した通りです。例えば、ネットワーク関係の信号のデータのみを処理するという感じです。

しかし、この方法には欠点もあります。お金の場合を考えるとわかりやすいので、お金の場合の例を挙げてみます。 例えば、手持ちの現金は 5 万円しか持っていなかったとします。しかし、お店に行ったら、10 万円の商品が欲しいという場合があるかと思います。現実の世界では、クレジットカードのような物があるので少し事情が違いますが、そのお店が現金のみでの販売しかしていない場合にはどうなるでしょうか?

この場合、一旦お店を出て銀行に行ってお金を下ろしてから購入するという事になります。その場合は、商品を押さえてもらうために手持ちの現金を手付金として払って、残額は銀行で下ろした上で、お店に戻って支払うという手順になります。つまり、二度手間になるというわけです。

実際の回路設計の検証では、ネットの種類(信号のタイプ)事に別々の処理が必要な場合が多く、必要な種類のデータを取り出しては処理をして、基本的に全ての信号を検証するというケースが多くなります。結局全部読み込むのならば、最初に全部読み込んで処理をした方が、全体の処理時間は短くできる場合が多くなります。実際に、ファイルの読み込みは時間がかかります。

そう考えると、使用するメモリを節約するか処理時間を優先するかで、プログラムの作り方も変わってきます。

現実的な実装は?
実際にこのような回路設計の支援アプリを作る場合には、一度に全てのデータ、つまりネットリスト全体を読み込んでしまう場合の方が多くなります。理由は簡単で今日の設計データの大きさは、一般的な PC のメモリ容量を考えると僅かな量で、何回もファイルを読み直すより一度で読んでしまった方が都合が良い場合が多いからです。ネットリスト全体の読み込みに要する時間も、最近の PC ならばせいぜい数十秒程度です。

このため、先日紹介した例でも、ネットリストのデータを Python の Dictionary に一度で読み込んでいます。

おそらく、シンプルな回路設計支援のアプリの場合には、この様にファイル全体を一度で読み込む方が便利ですし、プログラムもすっきりする場合が多くなります。

少し複雑な処理を考える場合には?
しかし、実際の回路設計の支援で必要な機能はもう少し複雑です。 というのも、実際に回路設計をする場合には、検証や設計した回路を実際にテストすると不具合が見つかリます。この場合、回路の設計を変更して不具合を修正する事になります。この場合、意図する部分を変更できたかを確認するために、接続情報を前のバージョンの回路と比較したい場合があります。

比較をする場合には、最新のバージョンと比較対象の以前のバージョンのデータを読み込んで処理する必要があります。

これも、比較する度に二つのバージョンのネットリストのデータを読み込めば済む話ですが、効率的に運用するには設計データを読み込んだ際にそのデータを保存しておけば、最新の設計データのみを読み込めば処理が可能になります。

こうしたケースによく利用されるのがデータベースというわけです。 データベースを利用すれば、読み込んだネットリストのデータをバージョン情報と一緒にデータベースに保存しておけば、プログラムから必要なデータをデータベースから取り出しながら処理する事が可能になります。

データベースにデータを置く場合、ネットリストのデータを扱い易い形で保存できるので一般的なネットリストのファイルから読み取るよりははるかに効率的に行う事ができます。データベースがプログラムを実行する PC と同じ場合には、データ量は同じなので利用するメモリの量はあまり変わりませんが、プログラムはシンプルに書くことが可能になります。

また、データベースをサーバーに置く事ができれば、実際に回路設計支援アプリを動かす PC で利用するメモリ容量は節約することも可能になります。データの取り出しは SQL などのデータベースならば、SQL のクエリを書けば少し複雑な条件でのデータの取り出しも簡単にできる様になります。

まとめ
プログラムで扱うデータは、同じデータに対して同じ様な処理をする場合にはデータの容量は基本的に同じです。 しかし、実際にプログラムの実行時に必要になるメモリ容量は、プログラムをどう作るか、データをどの様に扱うかで変わってきます。

ファイルのデータを利用する場合、必要なデータをその都度ファイルから読み込むような作りにすれば、使用するメモリを節約することは可能ですが、ファイルアクセスの場合アクセスのオーバーヘッドが大きいので、色々な条件でのデータ処理を行う場合、処理時間が増えてしまう場合が多くなります。そうした背景から、全体のデータ量があまり大きくない場合は、とりあえずデータ全体を一度に読み込んで処理する場合が多くなります。

しかし、データベースなどを利用してデータを保存すると、大規模なデータやバージョン毎のデータを扱う場合、データベースの機能を利用できるので、効率よく必要なデータを取りだず事が可能になります。

回路設計支援のアプリでは、バージョン間の比較などの機能の実装を考えると、データベースに保存してデータを処理するような実装を考えると、プログラムで必要なメモリ容量や必要なデータの取り出しを効率的に行う事ができるようになります。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す