HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0422
ソラ特定条件下でOpenCVを使うと巨大な変数を確保できない?12解決


ソラ

リンク

2018/4/22(Sun) 23:20:11|NO.84100

HSP3.5β6で以下のソースコードで、実行ボタンを押すとシステムエラーが発生します。
ただし、buttonを使わずただgotoでジャンプした場合は発生しません。

#include "hspcv.as" button goto "実行",*b ;goto*b;ただgotoで飛んだ場合は発生しない。 stop *b sdim a,1048576*1024;1GBの変数を確保する。 Dialog "正常に確保できました。" stop cvputimg 0;絶対に実行されないコード。

HSP3.5リリース版では以下のコードだけでシステムエラーが発生します。

#include "hspcv.as" sdim a,1048576*1024;1GBの変数を確保する。 stop cvputimg 0;絶対に実行されないコード。

OpenCVの使用時は巨大な変数の扱いを気をつけるしかないのでしょうか?
この不具合について、何か知ってる方が居たら教えてくれると助かります。



この記事に返信する


あらや

リンク

2018/4/22(Sun) 23:47:21|NO.84101

環境の問題でしょうか?

私の環境ではどちらも正常に実行できました。
Windows 10 Pro 64bit
メモリー 6GB

さすがにsdimで1GB確保の箇所で一瞬固まりますが、エラーにはなりませんでした。



メモリーが足りず充分な領域が確保できないとか、
何らかの理由でメモリーの確保に時間が掛かるとエラーになるとか
そういった事情でシステムエラーになるのではないかと考えました。

PCの環境に左右されそうなので正確な条件は不明ですが、
最初に実行するPCのメモリーの量を確認した上で
上限を設けるなどの対策が必要なのかもしれませんね。



MillkeyStars

リンク

2018/4/23(Mon) 01:59:29|NO.84103


#include "hspcv.as" cvreset
上記でエラー引き起こすのかなー。



ソラ

リンク

2018/4/23(Mon) 11:32:53|NO.84106

皆さん有難うございます。
今改めて実行してみたのですがエラーが全く発生しません。
メモリは16GB積んでるので不足はないと思うのですが・・・
うーん・・・困った・・・



zakki

リンク

2018/4/23(Mon) 21:11:02|NO.84111

32bitアプリだと2GB〜3GBしか利用可能な空間が無いので、十分(16GBとか)物理メモリあっても
1GBの連続したメモリを確保できるかは状況次第です。
64bit版HSP使うとか100MB配列10個として確保するとか…



ソラ

リンク

2018/4/24(Tue) 11:00:47|NO.84118

>>zakkiさん
HSPの仕様では先ほど貼ったソースコードはエラーに成らないはずです。
「状況次第」で片付けられても困ります。
発生の条件が明確に分かれば対処できますが、現状その「状況次第」がわからないわけです。

>>64bit版HSP使うとか
64bit版HSPってメモリの使用量増えてますっけ?確か32bit版と変わらなかったような・・・

>>100MB配列10個として確保するとか
もし次同じエラーが発生したら試してみます。



MillkeyStars

リンク

2018/4/24(Tue) 13:22:14|NO.84119

ソラさん。メモリを確保する時のアドレス(番地)は、プロセス毎に毎回違うのはわかりますよね?
その際に、1GB の連続した空間がないと malloc は失敗します。

zakki さんが言っているのは、32Bit の利用できる空間内でその連続した空間が存在しない場合があるってことです。
0x00000000 にプロセスモジュール
0x30000000 にモジュールA のメモリ
0x60000000 にモジュールB のメモリ
0x90000000 にモジュールC のメモリ
0xC0000000 にモジュールD のメモリ
0xD0000000 にモジュールE のメモリ

な状況で、サイズ 0x3E800000(1048576 * 1000) のメモリを確保しようとします。
この場合、連続した空間が存在しないことになるので、malloc は失敗します。
極端な仮定ですが、巨大なメモリを確保する際、十分にあり得るのです。

ちなみに私の環境では、1.4GB 確保しようとするとエラーを引き起こします。



ソラ

リンク

2018/4/24(Tue) 15:53:27|NO.84122

一つ訂正します。「64bit版HSPも使用可能なメモリの上限は32bit版と変わらない」と思っていましたが
1つの変数が2GBまでしか確保できないだけで2GBの変数を複数確保することはできるんですね。
(よく考えたら32bit符号付き整数の最大値までしか指定できないだけだった)

>>MillkeyStarsさん
>>zakki さんが言っているのは、32Bit の利用できる空間内でその連続した空間が存在しない場合があるってことです。
先程貼ったソースコードではHSPのメモリ使用量が数十MB程度と非常に少ないわけで、
その状況で1GBの連続した領域を確保はできない場合があるというのがどうも腑に落ちません。
詳しい理由については説明すると長くなると思うので聞きませんが、そういうものなのでしょうか?



MillkeyStars

リンク

2018/4/24(Tue) 21:57:08|NO.84130

「アドレス空間配置のランダム化」という仕組みを読んでもらった方が早いと思うよ。
https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E7%A9%BA%E9%96%93%E9%85%8D%E7%BD%AE%E3%81%AE%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E5%8C%96

この仕組みで、ランダムの番地にメモリが確保されてしまうので、連続した領域が減るという副作用がある。
それが巨大なメモリが確保できない場合がある理由。



ソラ

リンク

2018/4/24(Tue) 22:25:35|NO.84132

なるほど、ランダムに配置されるからメモリ使用量が少なくても連続した1GBを確保できない場合があるんですね。
となるとやはり変数を小分けにするしかなさそうですね。
あらやさん、MillkeyStarsさん、zakkiさん、詳しく書いていただいてありがとうございました。



AviSoftware

リンク

2018/4/26(Thu) 05:25:22|NO.84157

winだとasrlは無効化できる
no84130のurlのmicrosoftwindowsを押すと出てくるよ



ソラ

リンク

2018/4/26(Thu) 11:14:40|NO.84162

なるほど、ありがとうございます。
もしどうしてこの問題を回避できそうになかったらこのやり方も試してみます。



AviSoftware

リンク

2018/4/27(Fri) 19:30:21|NO.84183

但しレジストリいじるからAdministrator権限がいるよ



ONION software Copyright 1997-2021(c) All rights reserved.