VC++を使って、
2次配列[1000][640×480]を(FPS30)
リングバッファで書き込み、書き出しし、
ディスプレイに出力したいのですが、
当然メモリが足りず、仮想メモリを使用し、さらにFPS30
を大幅に下回ってしまいます。
配列のサイズを小さくすることも可能ですが、
なるべく上記の条件に近い方が望ましいです。
そこで書き込みしたての値を一時あえて仮想メモリに
保存し、必要になる手前で引き出して物理メモリ上に
置いておくといったプログラムを書いてみようかと思うのですが、
実現可能でしょうか?
もしくはよりよい対策あればお教えいただけますでしょうか?
当方、知識不足で仮想メモリを制御できるのかどうかも把握しておりません。
No.1
- 回答日時:
仮想メモリは1アプリケーションで制御出来る性質のものでは
ありません。システム全体で効率を考慮して制御されています。
もっともシステム要求を出せば制御出来るかもしれませんが、
論理ページが現在メモリか仮想メモリかを常にチェックしながら
処理する必要があるので、スーパーバイザーモードで走る必要
があり、これはもうアプリケーションの域を超えていますね。
簡単に効率を上げるのであれば、データベース化が1案です。
データベースは入出力とメモリのバランスを考慮しています。
それ以外であれば、大きな配列は諦めて、自分でファイルに
入出力ですね。仮想メモリの制御より現実的で制御も容易で
しょう。
一番簡単なのは4バイトデータなら1.2GB程度のデータなので
今時のPCにしたら2GBくらいの実メモリは容易でしょう。
PCを代えることですね。
No.2
- 回答日時:
★アドバイス
>当方、知識不足で仮想メモリを制御できるのかどうかも把握しておりません。
↑
仮想メモリの制御は OS のお仕事です。
ご自分での制御は難しいです。
>2次配列[1000][640×480]を(FPS30)
↑
普通にメモリを確保すれば約 293 MBです。
物理メモリが少なくても OS が勝手にディスク・ファイルにスワップ・アウトして
必要になったらスワップ・インします。つまり OS が仮想メモリを制御しているので
物理メモリが足りない環境でも動かせます。でも低速になりますが…。
今回は OS が仮想メモリを管理してもご自分で制御しても無意味です。1秒間に30回でしょ。無理。
・問題はなぜ FPS30 で2次配列[1000][640×480] ものデータを書き換える必要があるのかです。
前も同じような質問していましたよね。
一体何を行うために 2次配列[1000][640×480] が必要なのでしょうか?
前はグラフを書くのが遅いとかで質問していた方ですよね。
もっと良いアルゴリズムを探した方が良いです。
・補足要求します。
最終的には何をどのようにしたいのですか?
それによりもっと良い方法が見つかるかもしれません。
・本当に FPS30 で 1000 回も 640×480ドットの画面情報を収集しないといけないのですか?
この回答への補足
ご回答ありがとうございます。
プログラムの内容はFPS30で640×480(320×240でもいいのですが)で
WEBカメラから一定時間毎に動画を一時保管し、あるタイミングで
瞬時に放出するものです。
真に申し訳ないのですが、目的、全体の構造は申し上げることができないのですが、反応に瞬発力を要するため、HDに保管してしまうと
目的の処理速度を達成できません。
尚ほかの方も申すとおり配列のサイズは1GBを超えないのですが、
動画出力の際に簡単に使用メモリが1.5GB(2GBのPC)になってしまいます。
フレームバッファに1コマの情報が全てきてから出力するように
指示しているのですが、ここでの処理に時間がかかっております。
フレームレートを優先すると動画が乱れまくります(当然ですが)
巨大な配列を1つ宣言しているものの、他の処理は1コマ分ずつしか
処理していないにもかかわらず、メモリが制限いっぱいにすぐに
到達してしまうのはなぜなのでしょうか?
No.3
- 回答日時:
# 昨今のWindows上で動くアプリ書いてる時点で、物理的に
# どこにあるかを問わず常に仮想メモリ上だと思いますが。
> 実現可能でしょうか?
おそらく「実現可能でしょうか?」と質問するような人間が
やるよりはもう少し効率的に、既にOSがやってくれてます。
近しいことはできなくはありませんが、おそらく効果は薄い(多分無駄)です。
そもそも、仮想メモリでスワップアウトするような環境で、
物理メモリのロックをかけようとしても失敗して動作できません。
# 仮想メモリなら要求が空きサイズ以上でも受け入れてくれますが、
# 既に物理メモリに入りきらずにスワップされる状況で
# そのサイズを確実に取ろうとしてもOSに「無理」と言われて終了です。
> もしくはよりよい対策あればお教えいただけますでしょうか?
1.
他の方のいうように、仮に1pixelに24bit当てても1GBいかないので、メモリを増やしてみる。
また、本気で物理メモリをとりに行くなら、配列は連続した
アドレス空間を要求するため、アプリに2GBしかないアドレス
空間も考慮しないと、一見空きがあるように見えても確保失敗します。
# 1GB以上の連続空間ってのは結構難しいはず。
2.ちゃんとボトルネックを探す。本当にメモリのスワップアウトのせいですか?
どうやって確認しましたか?
多分、問題の根底は「とにかくメモリ上でぶん回せは早い」という発想と、
アルゴリズム上の無駄にあるのではないでしょうか。
この手の描画だと、システムメモリとグラフィックメモリの間の転送や、
ロック処理などに多大な時間を割かれます。
たとえば1pixel単位で書き出すなど、制御を頻発させたらアウトと思っていいかと。
No.4
- 回答日時:
640x480フルカラー(32bit)をFPS30だと35.2MB/sくらいでしょ。
速いHDDだったら十分に追いつける速度だと思いますけど。1000フレームだと30秒くらいでしょうか、適当な動画フォーマットでファイルに吐き出して動画再生プログラムに表示を任せるだけで良いのでは。
# 可逆圧縮系のフォーマットを選べば劣化もないでしょう
自前で表示するにしても、1GBもの配列を取ろうとするとシステムに無用な負担を掛けて反って遅くなるから、数フレーム分だけバッファを持ってファイルから読み込みつつ表示をしていけば十分なのではないですか。
No.5ベストアンサー
- 回答日時:
★アドバイス
・メモリマップドファイルをつかってみてはどうですか?
これは仮想メモリと同じ仕組みを簡単に実現できる『技』です。
下の『参考URL』やネット検索して下さい。
・以上。
参考URL:
・http://homepage2.nifty.com/DSS/PT/HTML/Win/FileM …
・http://marupeke296.com/DXCLS_MemoryMappedFile.html
No.6
- 回答日時:
HDDなどではなく、これなどを使えば解決しません?
http://www.links.co.jp/html/press2/news_i-ram.html
普通のHDDも間に合いそうな気がするんですけどね。
当然バッファの書き出しはスレッドで行います。
No.7
- 回答日時:
WEBカメラからの出力ということですが、でしたらわざわざDIBにしなくても動画再生という手法が一番楽だと思います。
また、この処理をするならばDirectX等のグラフィックメモリを用いることも考えられます。
別の方法では、いわゆるストリーミングですね。たとえば、常に60フレームをメモリに溜め込む方法です。使用済みのフレームはメモリから破棄し、現在から60枚先のフレームを取得。この方法ならばAPIだけでも60fpsは出せます。他にもゲームプログラムを参考にすると色々方法は出てくるでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(パソコン・周辺機器) NVIDIAのシェーダーキャッシュ 1 2022/05/30 22:36
- Windows 10 Windows10が頻繁に応答なし、再起動になって困ってます 12 2022/10/20 22:55
- iPhone(アイフォーン) iCloudのデータをiPhoneメモリに移動したい 1 2022/10/24 22:11
- CPU・メモリ・マザーボード 「コンピューターのメモリが不足しています」 5 2022/12/15 10:10
- Windows 10 仮想メモリ 5 2023/02/21 15:17
- CPU・メモリ・マザーボード 「コンピューターのメモリが不足しています」 3 2022/12/15 22:07
- CPU・メモリ・マザーボード Windows11アップデート後の不具合(メモリ不足)について 9 2023/01/04 11:34
- システム CPUの問題について 2 2022/07/09 12:04
- CPU・メモリ・マザーボード ノートパソコンでクロック数の違うメモリを1枚ずつ挿してデュアルチャンネルになりますか? 1 2022/11/18 00:30
- その他(パソコン・周辺機器) タブレットで使用するUSBメモリについて 7 2022/05/26 14:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
大容量のメモリ確保をスワップ...
-
メモリのセグメント違反の解決...
-
sil_rew_memのメモリアクセスに...
-
[ちょっと息抜き]メモリを解放 ...
-
メモリ不足
-
「ヒープサイズの設定」て何?
-
VB.netでUSBメモリの固有I...
-
メモリを解放しないとどうなる?
-
malloc関数の使い終わった後の...
-
C言語における再帰呼び出しの...
-
<jsp:include>の属性、flushに...
-
C言語 昇順・降順 ソート
-
メモリの解放について VB6 VBA
-
メモリが不足しています(VBA)
-
小さなプログラムのメモリ消費...
-
ファイルマッピング関数で失敗
-
仮想メモリの増やし方
-
バッチファイルでの実行EXEのメ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
「ヒープサイズの設定」て何?
-
C言語における再帰呼び出しの...
-
エクセルVBA 大容量CSVファイル...
-
動的メモリとexit(C言語)
-
エクセルのメモリ使用状況/Appl...
-
メモリが不足しています(VBA)
-
ファイルマッピング関数で失敗
-
大容量のメモリ確保をスワップ...
-
メモリのセグメント違反の解決...
-
EXCEL-VBAにてADOのレコードセ...
-
メモリ不足
-
エクセル キャッシュメモリー...
-
【C言語】再帰が時間がかかる...
-
C#のOutOfMemoryException発生...
-
closeとメモリの開放について
-
バッチファイルでの実行EXEのメ...
-
メモリの解放について VB6 VBA
-
「memcpy」と「strcpy」について
おすすめ情報