■76457 / inTopicNo.12) |
Re[7]: Global.asax における静的共有変数の取り扱い |
□投稿者/ 細川翔 (9回)-(2015/07/12(Sun) 19:04:39)
|
■No76456 (WebSurfer さん) に返信
WebSurfer さん、詳細なる回答、有難うございました。
> ■No76454 (細川翔 さん) に返信 > >>まず、私が知りたいことは、 > > >>1)OSが64bitの場合、Global.asax にて、public static string gMyStr 変数に >> 500MBから1GBの文字列を代入可能か >>2)代入可能の場合、各ページ(*.aspx.cs)から、この変数の値をASP.global_asa.gMyStr の形で参照可能か > > >>という可能性を知りたく思いました。 > > 自分は経験ないので推測に過ぎませんが、OS のメモリ管理が許せば問題なく可能 > だと思います。
皆さんからいただいた情報から、VS付属の開発サーバを使っているために、メモリ上の制約が でていたように思われます。私の開発環境(Windows 8.1 Pro)にIIS を有効化しましたところ、 VS付属の開発サーバではメモリー不足のエラーがでましたが、その状態でIISにて閲覧する 1GB程度(1,049,012,131 Bytes)のデータが読み込めるようになりました。
> > ちなみに、質問者さんのコードを自分の環境(Vista SP2 32-bit, IIS7, .NET 4)で > 試してみましたが、期待通り取得できました。質問者さんのコード 5120000 * 2 は > 102,400,000 文字なのでコンピュータのメモリ上では約 200MB になります。 > > 32-bit OS でも 200MB 程度で OutOfMemoryException がスローされることはなかった > です。
フォローしていただき有難うございました。
> > 質問者さんのケースでは 64-bit OS で 64GB メモリながら、50MB で問題とのことで > すが、メモリの制約と言うよりどこかやり方が間違っているような気がします。
はっきりしませんが、VS付属の開発サーバの制約ではないか、と思っております。
> > ちなみに自分が試したコードは以下の通りです。 > > <script runat="server"> > > public static string gMyStr = ""; > > void Application_Start(object sender, EventArgs e) > { > > StringBuilder sb = new StringBuilder(); > > string MyData = "私は、月光仮面です。"; > int MyInt = 5120000 * 2; > for (int i = 0; i < MyInt; i++) > { > sb.Append(MyData); > > } > > System.Diagnostics.Debugger.Break(); > > gMyStr = sb.ToString(); > } > > > protected void Page_Load(object sender, EventArgs e) > { > string test = ASP.global_asax.gMyStr; > > string savePath = HttpContext.Current.Server.MapPath("~/FileUploadTest/"); > string filename = "test" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".txt"; > > System.IO.File.WriteAllText(savePath + filename, test, System.Text.Encoding.UTF8); > } > > System.Diagnostics.Debugger.Break(); を追加したこと、渡された文字列をファイル > に書き込んだこと以外は質問者さんのコードと同じです。 > > System.Diagnostics.Debugger.Break(); を追加したのは、IIS 上で動かすとブレーク > ポイントで止まらないからです。詳しくは以下のページを見てください。 > > Application_Start のデバッグ > http://surferonwww.info/BlogEngine/post/2011/08/26/How-to-stop-at-breakpoint-set-in-the-Application_Start-method.aspx
大変助かります。
> ファイルに落としたのはデバッガでは確かめようがないからです。文字コードを UTF-8 > にしたのでサイズは 200MB x 3/2。エクスプローラで見ると 300,001KB となっていまし > たのでサイズの辻褄は合いますね。中身はワードパッド(メモ帳では大きすぎて開けま > せん)で開いて確認してます。
分かりました。
> >>もし、可能ならば、現在、ボトルネックは解決可能と思えたからです。 > > ホントにそこがボトルネックなのでしょうか? > > 今までどうやっていたのか知りませんが、どうやってそこがボトルネックだと確認した > んですか?
失礼しました。一つのボトルネックの可能性があるのでは、といった思いでした。
> > ボトルネックになっているとしても、サーバーのメモリに保持する以外には全く改善の > 方法はないのですか? どこまで可能性を調べましたか?
全ての可能性を尽くしたという訳ではありません。私の分かる範囲での可能性をチェックしている といったところです。
> > >>ええ、知っております。 > > すでにいろいろ知っておられるようで、これ以上私がお役に立てることはなさそうです。 > あとは他の方の回答をお待ちいただくか、自助努力でおねがいします。
有難うございました。大変、有益な情報を戴きましたこと、並びに追実験を行って戴きましたこと、 厚く御礼申し上げます。 >
|
|