- ベストアンサー
大きな配列データを複数ある場合のデータ保持の方法
indowsXP VC++.net2003で開発をしています。 100*100程度の2次元配列が20から50程度ある場合、データはどう保持しているのが良いのでしょうか? 同時に使うのは1個のみですので、すべて宣言するのはメモリの無駄だと思っています。 思いついた方法は 1.テキストファイルに保持しておく 2.データベースに保持しておく の2つですが、ユーザーに配列の中身が見られたり変更されたりするのも困るので1の方法は却下しました。 2の方法ですがデータベースを用意するのは無理なのであきらめました。 また、配列データはツールから作成しており、以下のように宣言しやすいように表示されます。 値をひとつひとつ代入して初期化するのも大変なので、できればこの表示をいかしたまま、 必要な配列を取り出して扱うということをしたいのですが、何か良い方法はないでしょうか? それともint型の100*100の2次元配列 50個程度なら宣言したほうがいいのでしょうか? int test[32][32] = { {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 以下省略
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
int型の100×100の2次元配列50個程度なら数MBだと思うので, メモリが厳しい環境でなければ宣言してしまっても問題ないと思います. メモリの事を気にするのであれば, 動的に宣言するのが一般的だと思います.
その他の回答 (2)
- rot-N
- ベストアンサー率27% (118/432)
intが、2もしくは4バイトで、100×100だから1万、これが50個。 4×100×100×50=2000000ですよね? およそ2000キロバイトで2メガバイト。いまならファイルの読み書きでもキャッシュに入ってしまう様な容量です。(この程度の計算をしてから質問しようね。) 上記を回答に代えて。 メモリの読み書きを、人が本のページをめくる早さだとすると、HDDの読み書きは、近所から宅配便(バイク便程度かなぁ(^o^))で送ってもらうようなもの(厳密には計算していません)。 それでも良ければ、「バイナリデータのファイル」を用意しても良いかと。 貴方の課題が速度について言及していませんが、蛇足まで。
お礼
解答ありがとうございます。 メモリが厳しい環境を想定しているわけではないですが、 他の部分でのメモリ使用量もまだわかりませんし、 これから配列の大きさや数が増えるかもしれないので メモリを使わない方法がないかと思って質問しました。 今はこの程度の使用量なら宣言するのが一般的なんですね。 速度はそれほど気にしていませんが、バイナリでも変更 されてしまいそうなので、その方法は使わないことにしました。
- ency
- ベストアンサー率39% (93/238)
配列データとして、どこかに持っておかなければいけないわけですよね? それを、プログラムに組み込んでしまってメモリ上にすべて展開してしまうか、外部記憶に保存しておいて必要なものだけメモリ上に展開するのか、というお話で良いですよね? No1 boozer2005 さんが回答されているように、メモリサイズに余裕があるのであれば、そのままプログラム上に定義してしまって良いと思います。 もし、メモリサイズにあまり余裕がないような場合には、何らかの方法で外部記憶にデータを持たせて、必要な分だけ動的に領域を確保する、という方法にならざるを得ないと思います。 あと、そのデータが頻繁に更新されるような場合にも、その都度コンパイルを繰り返すことになるため、外部記憶にデータを持たせるべきでしょう。 さて、外部記憶にデータを持たせる方法ですけど、何もテキストファイルにする必要なないと思います。 たとえば配列イメージをそのままファイルに落とせば、バイナリファイルにしかならないでしょうし。 # ま、この場合、テキストエディタで開いた場合には見れないけど、 # バイナリエディタで開かれたら丸見えになってしまうんですけどね。 あとは、暗号化をしてファイルに保存するとかいう方法もあるでしょう。 簡単な方法としては、すべてのデータを 0xAAAAAAAA と XOR してからファイルに保存します。 そしてファイルから読み込んだ後は、そのデータをまた 0xAAAAAAAA と XOR をとれば、データは元に戻ります。 しかも、ファイルには全然別のデータが書き込まれることになります。 ちなみに、XOR をとるのは何でも良いです。 0x12345678 でも良いですし、0xDEADBEEF でもかまいません。 要は、同じ値で 2回 XOR すれば元の値に戻るので、それを使っているだけです。 # どうして、元に戻せるのかは、ちょっと考えてみてください。 こんなんで、参考になりますか?
お礼
解答ありがとうございます。 なるほど、バイナリファイルに保持するのですか。 配列イメージをそのままというのがよくわからないのですが、バイナリエディタでも変更されてしまうのはまずいので 動的に宣言しようと思っています。
お礼
解答ありがとうございます。 ローカル宣言している関数を用意して、 そこからコピーすれば必要な分だけメモリを使用できそうですね。