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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0502
基本事項を知らない中級者作業領域33解決


基本事項を知らない中級者

リンク

2011/5/2(Mon) 10:54:55|NO.38869

エラトステネスの篩を実行しようと思うのですが、
変数やファイルマッピングオブジェクトその他をあわせた
作業領域が4GBを超えることは可能でしょうか。
ここに載っている、「4Gバイトの仮想アドレス空間」というのが気になります。
http://yokohama.cool.ne.jp/chokuto/urawaza/commonmem1.html

どうか教えてください。



この記事に返信する


SYAM

リンク

2011/5/2(Mon) 11:15:00|NO.38870

>可能でしょうか。

HSPの基本的な構文と機能では不可能だと思います。

そもそも、2Gを超えた時点でデータにアクセスする手段がなくなります。

というのは、
HSPで扱える整数は(基本的には)符号付4バイト整数です。この型が表せる数値の範囲は-2147483648〜2147483647。2Gといったら 2*1024*1024*1024=2147483648.
つまり、2Gを超えてしまうと、「**バイト目にアクセスしなさい」という指示を出したくても、その数を表現できないわけです。



ede

リンク

2011/5/2(Mon) 11:50:19|NO.38873

64bit版のHSPが出てこない限り無理ですね。
そもそも本当にそんな巨大な領域が必要なのかを見直してみた方がいいです。
エラトステネスの篩なら領域を分割して処理するとかの方法を考える方がいいでしょう。



HK2

リンク

2011/5/3(Tue) 00:56:31|NO.38925

自分で試したわけでないので間違ってるかもしれませんが、
2〜2147483647(2^31-1)の間で検索するなら、256MByteの空間で十分だと思います。
整数型の最大値以上の素数を扱わないのであれば心配する必要は無いと思います。



基本事項を知らない中級者

リンク

2011/5/3(Tue) 18:34:07|NO.38960

つまり、いくら作業領域を分割しようとも、
全体として2Gを超えることはできない、という認識でいいですか?



HK2

リンク

2011/5/3(Tue) 19:49:08|NO.38961

最初に示されたURLの内容を読んでいくとできそうな気がします。



ede

リンク

2011/5/4(Wed) 11:20:55|NO.38973

>つまり、いくら作業領域を分割しようとも、
>全体として2Gを超えることはできない、という認識でいいですか?
いまいち意味が分からない。
分割するというのは一つの作業領域(メモリ)を使い回して、巨大な対象領域を分割して処理を次々行うと言うことです。
作業領域は2Gを超えらないが対象領域はそれ以上でも処理できるという意味です。



基本事項を知らない中級者

リンク

2011/5/4(Wed) 22:58:07|NO.38986

分割とはそういった意味でしたか。
すみませんでした。

作業領域が2Gを超えられない、ということは理解できました。
ありがとうございました。



基本事項を知らない中級者

リンク

2011/5/8(Sun) 23:36:27|NO.39070

追加質問です。
もし、dupptrでintの最大値より一つ前の場所を開始位置に指定して、
そしてさらに先の範囲を参照すると、どうなりますか?
その場合には、さらに先の部分のメモリが使えるのですか?



基本事項を知らない中級者

リンク

2011/5/9(Mon) 01:09:02|NO.39074

こう書いてみたら、peek時にWin側から
「エラーにより終了、報告してくれ」
なんて言われて強制終了。
これはもうだめ、ってことですか?

#runtime "hsp3cl" mes "Boot." dupptr msg,2147483646,30,2 mes "Sdimed." repeat 30 mes "mes "+cnt mes peek(msg,cnt) loop stop



基本事項を知らない中級者

リンク

2011/5/9(Mon) 01:10:59|NO.39075

あり?
投稿した後にこうしてみても駄目だった。
どうなんですか?

#runtime "hsp3cl" mes "Boot." dupptr msg,2147,30,2 mes "Sdimed." repeat 30 mes "mes "+cnt mes peek(msg,cnt) loop stop



基本事項を知らない中級者

リンク

2011/5/9(Mon) 01:21:17|NO.39076

もしかして、なんでもない場所のメモリ参照がそもそも駄目だということですか?
それなら、指定した場所に何かを置くことはどうやってできますか?



ede

リンク

2011/5/9(Mon) 12:03:54|NO.39078

すべてのアドレス空間にメモリが割り当てられているわけではありません。
メモリが割り当てられていない領域にアクセスしたらエラーになるに決まってます。
それと作業領域が2Gを超えられないといったのはHSPの問題ではなくOSの問題です。
32bitのWindowsではプロセスは4Gのアドレス空間が割り当てられますがそのうち
2GはOSが使用していて、アプリーションは残りの2Gしか使えません。
その2Gの領域のうちの必要な部分にだけメモリを割り当てて使います。



基本事項を知らない中級者

リンク

2011/5/9(Mon) 18:39:47|NO.39082

では、CreateFileMappingで
なぜ上位32ビットのパラメータが用意されているのですか?



Cookies

リンク

2011/5/9(Mon) 18:58:10|NO.39084

edeさんの言っていることについては、
http://itpro.nikkeibp.co.jp/article/COLUMN/20071107/286607/
この一番下をみてください。

CreateFileMappingは、オブジェクトを作ります。
それをメモリに対応させるわけでなく、あとでマッピングするための準備です。

MapViewOfFileExでは、オフセットを32+32bitであらわし実際にマッピングできます。
しかし、サイズは32bitです。

CreateFileMappingした後に、MapViewOfFileExで32bit以上にアクセスする場合、
その準備をするために上位サイズを指定するわけです。



edu

リンク

2011/5/9(Mon) 20:23:10|NO.39087

>では、CreateFileMappingでなぜ上位32ビットのパラメータが用意されているのですか?
えとですねCookiesさんも説明してくれてますが補足すると
CreateFileMappingでは4Gを超えるファイルマッピングオブジェクトを作れますがそのすべてを
アドレス空間に割り当てることができるわけではありません。
実際に割り当てられるのはやっぱり2Gまでになります。



基本事項を知らない中級者

リンク

2011/5/10(Tue) 21:58:06|NO.39100

先頭から2Gまでとそれから先を分けて、
dupptrで2つ変数を分ければ4Gの領域が扱えるのではないでしょうか。



oi

リンク

2011/5/11(Wed) 00:25:23|NO.39104

>先頭から2Gまでとそれから先を分けて、
>dupptrで2つ変数を分ければ4Gの領域が扱えるのではないでしょうか。

扱えるんなら扱えばいいだろ

みなさんの意見をまとめるとこういうことでしょう。


dim dat, 25 dat.0 = 0x4F91BC96, 0xD082F082, 0xC182CB82, 0xA282C482 dat.4 = 0xE682E982, 0xBE82A482, 0x4181AA82, 0xCB82D082 dat.8 = 0xBD82C182, 0x9A93F189, 0xFA8ACD82, 0xB782D291 dat.12 = 0xC882F182, 0x53480A0D, 0x92AA8250, 0x82DF82E8 dat.16 = 0x82A282C4, 0x8AA282C8, 0x8E7B96EE, 0x82808D96 dat.20 = 0x505348F0, 0xA68E668C, 0xC582C294, 0xAD82B795 dat.24 = 0x0000C882 dupptr pdat, varptr(dat), 1, 2 dialog pdat



OIKO

リンク

2011/5/11(Wed) 11:10:49|NO.39110

これは基本レベルではないと思いますがね



edu

リンク

2011/5/11(Wed) 13:15:50|NO.39113

>先頭から2Gまでとそれから先を分けて、
>dupptrで2つ変数を分ければ4Gの領域が扱えるのではないでしょうか。
扱えるのかもしれませんが、その領域にアクセス可能なメモリを用意できなければ
アクセスした瞬間にエラーになりますので意味無いと思います。



HK2

リンク

2011/5/11(Wed) 20:24:29|NO.39120

パソコンのメモリーは、作業机のようなものです。

この机の上に箱を30個まで置けるとします。
このときに、最初に30個を置いて、
そのあとでさらに30個を置こうとするとどうなるでしょうか。
当然置くことはできません。

この机の広さ的には60個の箱を置けますが、
机の上には大切なものが色々置いているので、
30個までしか置けなくなっています。

その大切なものを削って45個まで箱をおけるようにできる方法(4GT)があるようですが、
HSPで使えるかどうかはわかりません。

30個まで置けるからといって、30個置いてしまうと、
作業スペースがなくなってしまうので、30個も置けません。
HSPのシステムもその机の上に物を広げています。


なお、この机は空間がねじれていて別のところに接続されています。
目で見ると自分が置いた場所にきちんとあるように見えますが、
実際は違うところにあります。
これについては意識しないですむように作られているので、考えないでください。
別のところに接続されていない机の場所は物を置くことも取り出すこともできません。
それを使えるようにするには、手続きをしなければいけません。
手続きなしでは使えません。



Next

リンク

2011/5/11(Wed) 23:59:14|NO.39127

良い例だ



基本事項を知らない中級者

リンク

2011/5/12(Thu) 16:22:05|NO.39164

ここの概要を読んで理解しました。
http://ja.wikipedia.org/wiki/4-Gigabyte_Tuning
64bit版のHSPは存在しないということなので、
HSPで扱えるメモリの(空間的な)範囲は
やはりsigned intの範囲ということなのでしょうか。



edu

リンク

2011/5/13(Fri) 08:46:34|NO.39199

いくら説明しても、延々と同じような質問を続けてますが何か根本的なことを理解してないような気がします。
もうちょっと具体的にどんなことがやりたいのかも書けば有益な答えが返せるかもしれません。
それとも単にwindowsのメモリ管理について知りたいのなら検索すればいっぱい出てきますので、まずはそこから調べてみてください。



whoさん

リンク

2011/5/13(Fri) 18:24:11|NO.39202

基本事項を知らない中級者さん、メモリのことは理解していますか?
僕からみると”基本事項を知らない「初」級者”に見えるのですが…



基本事項を知らない中級者

リンク

2011/5/14(Sat) 00:58:29|NO.39205




HK2

リンク

2011/5/14(Sat) 09:43:06|NO.39209

それはXPの宣伝ですね。

メモリーを学ぶなら
http://tokyo.cool.ne.jp/chokuto/win/memory.html
の方がいいと思います。

eduさんのおっしゃるとおり、やりたいことを具体的に書いてください。



ORZ

リンク

2011/5/14(Sat) 10:00:06|NO.39210

これは……無限ループ!?

break

もっと初級的な事を勉強しよう。貼られたURLで。



基本事項を知らない中級者

リンク

2011/5/14(Sat) 15:37:29|NO.39211

>論理的には、4Gのアドレスが与えられている。
>ただし、上位2Gはカーネルが占有しているので使えない。
>さらに、コミットして使える領域はさらに少ない。

こういうことですか?



HK2

リンク

2011/5/14(Sat) 17:41:46|NO.39212

そういうことでしょう。


HSPでは通常、メモリーのアドレスを使うことはありません。
使う場合でも、その数値に関して考える必要はないでしょう。
利用可能なアドレスをシステムが決定してくるからです。

ただ、これは私が知っている範囲での話なので、その数値を考えることが
大切な場合があるかもしれません。
ご存知の方、ご指摘いただけるとありがたいです。



rat2

リンク

2011/5/14(Sat) 18:19:14|NO.39213

そもそも4G以上のメモリを必要とするプログラムなんて、
スパコン向け以外ではありえないので、
4G以上を使う方法なんて考えなくてもいいと思いますけど…

エラトステネスの篩にそんなメモリ必要ありませんし、
HSPの処理速度では4Gのメモリが必須になる桁までたどり着けません



whoさん

リンク

2011/5/14(Sat) 20:24:46|NO.39214

というか、HSPでは4GBのメモリなんて確保できませんよ。



ssicker

リンク

2011/5/15(Sun) 06:51:18|NO.39216

普通の方法ではないですが、32bitアプリでも4G以上のメモリを使うことは可能なので
理論上だけならHSPで4GB以上のメモリを確保することはできます。

ただし当然HSPの基本構文だけでは不可能ですし
それが実現できる技量があれば、そもそもHSPを使う必要性はゼロです(^^;



whoさん

リンク

2011/5/15(Sun) 14:12:21|NO.39217

>>ssickerさん
ですよね。



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