C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[15]: Global.asax における静的共有変数の取り扱い


(過去ログ 129 を表示中)

[トピック内 23 記事 (1 - 20 表示)]  << 0 | 1 >>

■76443 / inTopicNo.1)  Global.asax における静的共有変数の取り扱い
  
□投稿者/ 細川翔 (1回)-(2015/07/12(Sun) 11:49:47)

分類:[.NET 全般] 

初めて質問させていただきます。

開発環境:Visual Studio 2012
使用言語:C#

質問内容:ASP.NET 上、Global.asax にて、1GB程度の文字列データを作成、一つの静的共有変数(public static string gMyStr)に代入し、
各ページ(*.aspx.cs)から参照(ASP.global_asax プレフィックスにて、例えば、string MyStr2 = ASP.global_asax.gMyStr; )したいと
考えておりますが、メモリ上の制約か、50MB程度を超えると、機能せず、System.OutOfMemoryExceptionが発生いたします。以下に
核心部分を示しますが、対応策、制約等ご教示頂ければ幸いです。

[Global.asax]
<script RunAt="server">

public static string gMyStr = "";
void Application_Start(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();

  string MyData="私は、月光仮面です。";//10文字
int MyInt=5120000*2;
for (int i = 0; i < MyInt; i++)
{
sb.Append(MyData); // 10文字

}
gMyStr += sb.ToString();
}

[*.aspx.cs]

string gMyStr2 = "";
protected void Button1_Click(object sender, EventArgs e)
{
try
{
gMyStr2 = ASP.global_asax.gMyStr;
}
catch (Exception ex)
{
}
}


引用返信 編集キー/
■76447 / inTopicNo.2)  Re[1]: Global.asax における静的共有変数の取り扱い
□投稿者/ WebSurfer (616回)-(2015/07/12(Sun) 12:52:43)
No76443 (細川翔 さん) に返信

> System.OutOfMemoryExceptionが発生いたします。

単に質問者さんの環境に依存する問題ではないのでしょうか?

環境が書いてないので(ちゃんと最初に書きましょうね)ハズレかもしれません
が、もしサーバー OS が 32-bit でしたら、それを 64-bit OS に変更し、メモリ
を十分な量に増設し、ASP.NET Web アプリケーションが 64 ビットで動作するよう、
Web サーバのワーカプロセスの動作モードを設定するというような方法で解決する
かもしれません。

ただ、それ以前に、1GB もの大きなデータをメモリの保持しておく必要が本当に
あるのか、他にもっと現実的な手段はないのかを検討された方がよさそうな気が
します。
引用返信 編集キー/
■76448 / inTopicNo.3)  Re[2]: Global.asax における静的共有変数の取り扱い
□投稿者/ 細川翔 (2回)-(2015/07/12(Sun) 13:34:06)
No76447 (WebSurfer さん) に返信

早速の返答、有難うございました。

> ■No76443 (細川翔 さん) に返信
>
>>System.OutOfMemoryExceptionが発生いたします。
>
> 単に質問者さんの環境に依存する問題ではないのでしょうか?
>
> 環境が書いてないので(ちゃんと最初に書きましょうね)

失礼いたしました。サーバーOSは、64-bit です。

> ハズレかもしれません
> が、もしサーバー OS が 32-bit でしたら、それを 64-bit OS に変更し、メモリ
> を十分な量に増設し、ASP.NET Web アプリケーションが 64 ビットで動作するよう、
> Web サーバのワーカプロセスの動作モードを設定するというような方法で解決する
> かもしれません。

ご教示有難うございます。具体的な設定方法を調べて試みます。

> ただ、それ以前に、1GB もの大きなデータをメモリの保持しておく必要が本当に
> あるのか、他にもっと現実的な手段はないのかを検討された方がよさそうな気が
> します。

キーワードの特定されない日本語文コーパスから任意のキーワードを高速検索アル
ゴリズムにて、抽出したいと考えております。メモリ上の制約が外せれば、ハード
のメモリを駆使したいと思っております。

引用返信 編集キー/
■76449 / inTopicNo.4)  Re[3]: Global.asax における静的共有変数の取り扱い
□投稿者/ 細川翔 (4回)-(2015/07/12(Sun) 14:03:23)
No76448 (細川翔 さん) に返信

自らの返答です。

> ■No76447 (WebSurfer さん) に返信
>
> 早速の返答、有難うございました。
>
>>■No76443 (細川翔 さん) に返信
>>
> >>System.OutOfMemoryExceptionが発生いたします。
>>
>>単に質問者さんの環境に依存する問題ではないのでしょうか?
>>
>>環境が書いてないので(ちゃんと最初に書きましょうね)
>
> 失礼いたしました。サーバーOSは、64-bit です。
>
>>ハズレかもしれません
>>が、もしサーバー OS が 32-bit でしたら、それを 64-bit OS に変更し、メモリ
>>を十分な量に増設し、ASP.NET Web アプリケーションが 64 ビットで動作するよう、
>>Web サーバのワーカプロセスの動作モードを設定するというような方法で解決する
>>かもしれません。
>
> ご教示有難うございます。具体的な設定方法を調べて試みます。
>
>>ただ、それ以前に、1GB もの大きなデータをメモリの保持しておく必要が本当に
>>あるのか、他にもっと現実的な手段はないのかを検討された方がよさそうな気が
>>します。
>
> キーワードの特定されない日本語文コーパスから任意のキーワードを高速検索アル
> ゴリズムにて、抽出したいと考えております。メモリ上の制約が外せれば、ハード
> のメモリを駆使したいと思っております。

少し調べてみましたが、私のOS、Windows Server が64 bitですので、Windows 2008 以前の32bit
での、boot.ini /3GB のような処理は不要となるのではと思われます。そうしますと、

1)Global.asaxで設定した public static string MyData... ような静的共有変数には、
そもそも、1GB 程度の文字列データならば代入可能、かつ、各ページ(*.aspx.cs)から
参照可能
2)もし、1)が可能ならば、どこか別のところに問題がある、

と思われます。

さらにご教示願えれば嬉しく存じます。

>
引用返信 編集キー/
■76450 / inTopicNo.5)  もうすこし、環境を書いて欲しい
□投稿者/ daive (66回)-(2015/07/12(Sun) 14:37:57)
2015/07/12(Sun) 14:43:39 編集(投稿者)

開発環境:Visual Studio 2012、エディション不明
使用言語:C# .NET Framework 、 Any/x86/x64 の別も欲しい
使用OS:x64
メモリー:不明
OSは?
バージョン不明、エディション不明、x64らしい
IISは?
バージョン不明、設定不明、メモリー関係の設定を行ったかどうかも不明

ASP.NETは、IIS環境下で動作するのは、理解できていますよね?
⇒メモリーエラーが出ると、書かれています。
 それとも、IDEから、デバッグ実行した場合ですか?
回答者側が、再現する為の環境を用意しようとしても、
現状の書込みでは、環境すら再現できませんよね?
(回答者は、質問者と会話したり、その、頭の中を覗けないのです。)
ということ。
引用返信 編集キー/
■76451 / inTopicNo.6)  Re[5]: Global.asax における静的共有変数の取り扱い
□投稿者/ 細川翔 (5回)-(2015/07/12(Sun) 14:50:56)
No76450 (daive さん) に返信

daive さん、回答有難うございました。
情報不足で申し訳ありません。

> 開発環境:Visual Studio 2012、エディション不明
Ultimate 2012

> 使用言語:C#
> 使用OS:x64

> メモリー:不明
64.0 GB
> OSは?
> バージョン不明、エディション不明、x64らしい
Windows 8.1 Pro(開発環境。Server側は、Windows2008 and Windows 2012)

> IISは?
> バージョン不明、設定不明、メモリー関係の設定を行ったかどうかも不明

サーバー側のIISは、7。デフォルト設定にて特別の設定なし。開発環境では、
Windows 8.1 Pro 付属のIIS
> ’
> ASP.NETは、IIS環境下で動作するのは、理解できていますよね?
> ⇒メモリーエラーが出ると、書かれています。
>  それとも、IDEから、デバッグ実行した場合ですか?

ええ、開発環境でのデバッグ時の結果です。

> 回答者側が、再現する為の環境を用意しようとしても、
> 現状の書込みでは、環境すら再現できませんよね?
> (回答者は、質問者と会話したり、その、頭の中を覗けないのです。)
> ということ。

仰る通りですね。大変失礼いたしました。

引用返信 編集キー/
■76452 / inTopicNo.7)  Re[4]: Global.asax における静的共有変数の取り扱い
□投稿者/ WebSurfer (617回)-(2015/07/12(Sun) 15:03:57)
No76449 (細川翔 さん) に返信

> メモリ上の制約が外せれば、ハードのメモリを駆使したいと思っております。

質問者さんが作っている Web アプリのパフォーマンスに問題があって、そこのと
ころがボトルネックになっているのですか?

そうでなければ、そういうことは考える必要もないと思うのですが。


> 少し調べてみましたが、私のOS、Windows Server が64 bitですので、Windows 2008 以前の32bit
> での、boot.ini /3GB のような処理は不要となるのではと思われます。

先のレスで書いた「Web サーバのワーカプロセスの動作モードを設定する」と
いうのは、以下の記事に書いてある Step 14 のことです。

Part 3. ASP.NET 2.0 Web アプリケーションの 64 ビット対応
http://blogs.msdn.com/b/nakama/archive/2008/11/13/part-3-asp-net-2-0-web-64.aspx


> さらにご教示願えれば嬉しく存じます。

ASP.NET Web アプリは、クライアントから要求を受けるたびにスレッドプールから
スレッドを取得してその要求を処理します。すなわち、マルチスレッドアプリとい
うことはご存知ですよね。

そして、もっと厄介なことには、多数の同時要求を受け、要求しているクライアン
トは全部異なるということもご存知ですよね。

なので、何が何でも必要ということでない限り、分かりにくいバグの元になる static
変数を使うべきではないということもご存知ですよね。

自分のつたない経験で何ですが、自分は今まで使う必要は感じなかったです。(非同
期で呼び出す静的メソッドは除く)

どうしてもメモリ上に保持したいということなら、そのために ASP.NET に用意されて
いるアプリケーション状態を使ってはいかがですか?(それで OutOfMemoryException
の問題が解決できるかどうかは話が別かもしれないとは思いますが)

以下の記事にはアプリケーション状態を使用することのデメリット(パフォーマンス
が悪い)が述べられていますが、そのデメリットがボトルネックになるのでなければ、
static 変数を使うことによる種々問題を回避できるよう作ってあるアプリケーション
状態を使用すべきと思います。

[ASP.NET]アプリケーション全体で共有するデータを扱うには?(静的メンバ編)
http://www.atmarkit.co.jp/fdotnet/dotnettips/122globalobj/globalobj.html

引用返信 編集キー/
■76453 / inTopicNo.8)  Re[6]: Global.asax における静的共有変数の取り扱い
□投稿者/ daive (67回)-(2015/07/12(Sun) 15:27:21)
たぶん、WebSurfer さんのブログだと思いますが、(確証がないので、たぶんとさせていただきます。)
 ASP.NET 開発サーバーと IIS
 http://surferonwww.info/BlogEngine/post/2011/11/18/ASPNET-development-server-and-IIS.aspx
 IIS Express をインストールしました
 http://surferonwww.info/BlogEngine/post/2012/10/08/iis-express-installation.aspx

 関連情報も検索されて、現行開発環境と、サーバー環境の違いとか、
 Windows 8.1 Pro(開発環境。Server側は、Windows2008 and Windows 2012
 での、違いも、把握された方がよいかもしれません。( IIS 7 / 7.5 / 8 他)
引用返信 編集キー/
■76454 / inTopicNo.9)  Re[5]: Global.asax における静的共有変数の取り扱い
□投稿者/ 細川翔 (6回)-(2015/07/12(Sun) 15:30:15)
No76452 (WebSurfer さん) に返信

WebSurfer さん、ご丁寧な対応、有難うございます。

> ■No76449 (細川翔 さん) に返信
>
>>メモリ上の制約が外せれば、ハードのメモリを駆使したいと思っております。
>
> 質問者さんが作っている Web アプリのパフォーマンスに問題があって、そこのと
> ころがボトルネックになっているのですか?
>
> そうでなければ、そういうことは考える必要もないと思うのですが。

まず、私が知りたいことは、

1)OSが64bitの場合、Global.asax にて、public static string gMyStr 変数に500MBから1GBの文字列を代入可能か
2)代入可能の場合、各ページ(*.aspx.cs)から、この変数の値をASP.global_asa.gMyStr の形で参照可能か

という可能性を知りたく思いました。もし、可能ならば、現在、ボトルネックは解決可能と思えたからです。

>
>
>>少し調べてみましたが、私のOS、Windows Server が64 bitですので、Windows 2008 以前の32bit
>>での、boot.ini /3GB のような処理は不要となるのではと思われます。
>
> 先のレスで書いた「Web サーバのワーカプロセスの動作モードを設定する」と
> いうのは、以下の記事に書いてある Step 14 のことです。
>
> Part 3. ASP.NET 2.0 Web アプリケーションの 64 ビット対応
> http://blogs.msdn.com/b/nakama/archive/2008/11/13/part-3-asp-net-2-0-web-64.aspx

大変ためになる記事でした。有難うございました。

>
>>さらにご教示願えれば嬉しく存じます。
>
> ASP.NET Web アプリは、クライアントから要求を受けるたびにスレッドプールから
> スレッドを取得してその要求を処理します。すなわち、マルチスレッドアプリとい
> うことはご存知ですよね。

ええ、知っております。

> そして、もっと厄介なことには、多数の同時要求を受け、要求しているクライアン
> トは全部異なるということもご存知ですよね。

ええ、そうですね。

> なので、何が何でも必要ということでない限り、分かりにくいバグの元になる static
> 変数を使うべきではないということもご存知ですよね。
>
> 自分のつたない経験で何ですが、自分は今まで使う必要は感じなかったです。(非同
> 期で呼び出す静的メソッドは除く)
>
> どうしてもメモリ上に保持したいということなら、そのために ASP.NET に用意されて
> いるアプリケーション状態を使ってはいかがですか?(それで OutOfMemoryException
> の問題が解決できるかどうかは話が別かもしれないとは思いますが)

Application 変数の事を言っておられるのですよね。

> 以下の記事にはアプリケーション状態を使用することのデメリット(パフォーマンス
> が悪い)が述べられていますが、そのデメリットがボトルネックになるのでなければ、
> static 変数を使うことによる種々問題を回避できるよう作ってあるアプリケーション
> 状態を使用すべきと思います。

分かりました。検討いたします。

> [ASP.NET]アプリケーション全体で共有するデータを扱うには?(静的メンバ編)
> http://www.atmarkit.co.jp/fdotnet/dotnettips/122globalobj/globalobj.html

ええ、ここには、Application よりも、static のほうが有利と書かれていたことを記憶しております。

--
C#やVB.NETでは静的メンバが使えるため、実際にはApplicationオブジェクトを使う必要はない。
むしろ静的メンバを利用した方がパフォーマンスは向上する場合がある
--

この記事を含めて、インターネット上の種々の情報を集めておりましたが、解決には
至らず、このMLにて質問した次第です。

引用返信 編集キー/
■76455 / inTopicNo.10)  Re[7]: Global.asax における静的共有変数の取り扱い
□投稿者/ 細川翔 (7回)-(2015/07/12(Sun) 15:34:15)
No76453 (daive さん) に返信

daive さん、ご回答、有難うございました。

> たぶん、WebSurfer さんのブログだと思いますが、(確証がないので、たぶんとさせていただきます。)
>  ASP.NET 開発サーバーと IIS
>  http://surferonwww.info/BlogEngine/post/2011/11/18/ASPNET-development-server-and-IIS.aspx
>  IIS Express をインストールしました
>  http://surferonwww.info/BlogEngine/post/2012/10/08/iis-express-installation.aspx
>
>  関連情報も検索されて、現行開発環境と、サーバー環境の違いとか、
>  Windows 8.1 Pro(開発環境。Server側は、Windows2008 and Windows 2012
>  での、違いも、把握された方がよいかもしれません。( IIS 7 / 7.5 / 8 他)

ご教示有難うございました。これから調査いたします。
引用返信 編集キー/
■76456 / inTopicNo.11)  Re[6]: Global.asax における静的共有変数の取り扱い
□投稿者/ WebSurfer (618回)-(2015/07/12(Sun) 16:59:06)
No76454 (細川翔 さん) に返信

> まず、私が知りたいことは、
>
> 1)OSが64bitの場合、Global.asax にて、public static string gMyStr 変数に
>     500MBから1GBの文字列を代入可能か
> 2)代入可能の場合、各ページ(*.aspx.cs)から、この変数の値をASP.global_asa.gMyStr の形で参照可能か
>
> という可能性を知りたく思いました。

自分は経験ないので推測に過ぎませんが、OS のメモリ管理が許せば問題なく可能
だと思います。

ちなみに、質問者さんのコードを自分の環境(Vista SP2 32-bit, IIS7, .NET 4)で
試してみましたが、期待通り取得できました。質問者さんのコード 5120000 * 2 は
102,400,000 文字なのでコンピュータのメモリ上では約 200MB になります。

32-bit OS でも 200MB 程度で OutOfMemoryException がスローされることはなかった
です。

質問者さんのケースでは 64-bit OS で 64GB メモリながら、50MB で問題とのことで
すが、メモリの制約と言うよりどこかやり方が間違っているような気がします。

ちなみに自分が試したコードは以下の通りです。

<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 となっていまし
たのでサイズの辻褄は合いますね。中身はワードパッド(メモ帳では大きすぎて開けま
せん)で開いて確認してます。


> もし、可能ならば、現在、ボトルネックは解決可能と思えたからです。

ホントにそこがボトルネックなのでしょうか?

今までどうやっていたのか知りませんが、どうやってそこがボトルネックだと確認した
んですか?

ボトルネックになっているとしても、サーバーのメモリに保持する以外には全く改善の
方法はないのですか? どこまで可能性を調べましたか?


> ええ、知っております。

すでにいろいろ知っておられるようで、これ以上私がお役に立てることはなさそうです。
あとは他の方の回答をお待ちいただくか、自助努力でおねがいします。

引用返信 編集キー/
■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 となっていまし
> たのでサイズの辻褄は合いますね。中身はワードパッド(メモ帳では大きすぎて開けま
> せん)で開いて確認してます。

分かりました。

>
>>もし、可能ならば、現在、ボトルネックは解決可能と思えたからです。
>
> ホントにそこがボトルネックなのでしょうか?
>
> 今までどうやっていたのか知りませんが、どうやってそこがボトルネックだと確認した
> んですか?

失礼しました。一つのボトルネックの可能性があるのでは、といった思いでした。

>
> ボトルネックになっているとしても、サーバーのメモリに保持する以外には全く改善の
> 方法はないのですか? どこまで可能性を調べましたか?

全ての可能性を尽くしたという訳ではありません。私の分かる範囲での可能性をチェックしている
といったところです。

>
>
>>ええ、知っております。
>
> すでにいろいろ知っておられるようで、これ以上私がお役に立てることはなさそうです。
> あとは他の方の回答をお待ちいただくか、自助努力でおねがいします。

有難うございました。大変、有益な情報を戴きましたこと、並びに追実験を行って戴きましたこと、
厚く御礼申し上げます。
>
引用返信 編集キー/
■76458 / inTopicNo.13)  Re[8]: Global.asax における静的共有変数の取り扱い
□投稿者/ WebSurfer (619回)-(2015/07/12(Sun) 19:55:23)
No76457 (細川翔 さん) に返信

> VS付属の開発サーバを使っているために

これに懲りたら、今後は二度と・絶対に開発サーバーや IIS Express は使わないように
しましょう。(自分も人のことは言えませんが)

問題が解決したのであれば、解決済みにしてください。
引用返信 編集キー/
■76459 / inTopicNo.14)  Re[9]: Global.asax における静的共有変数の取り扱い
□投稿者/ 細川翔 (11回)-(2015/07/12(Sun) 20:25:51)
No76458 (WebSurfer さん) に返信
> ■No76457 (細川翔 さん) に返信
>
>>VS付属の開発サーバを使っているために
>
> これに懲りたら、今後は二度と・絶対に開発サーバーや IIS Express は使わないように
> しましょう。(自分も人のことは言えませんが)

了解いたしました。

> 問題が解決したのであれば、解決済みにしてください。

失礼いたしました。
解決済み
引用返信 編集キー/
■76461 / inTopicNo.15)  Re[8]: Global.asax における静的共有変数の取り扱い
□投稿者/ なちゃ (48回)-(2015/07/13(Mon) 03:08:28)
ちょっと補足しておきます。
メモリ容量(空間)と、連続して確保できるメモリ領域は別の問題です。
32ビットOSでも容量的には大抵1GB程度まではメモリ空間を使用できますが、連続メモリ領域(例えば単一の配列や文字列など)で1GB確保するのはかなり無理です(仮に確保できても他への影響が大きすぎて、簡単にメモリ不足エラーを引き起こしたりしてしまう)。
64ビットプロセスだと制約はずっと小さくなりますが、巨大な連続領域の確保と開放を繰り返すのはかなり負荷が大きいです。
アプリケーション開始時に確保してずっと使いっぱなしであればまあおそらく大丈夫だとは思いますが。

連続領域でなければ、32ビットでも1GB程度ならまず確保は大丈夫でしょう(がその後使えるメモリ量はかなり減ることになります)。
64ビットOSの場合、32ビットプロセスでもユーザメモリ空間は4GBまで使えますので、1GB程度なら大丈夫でしょう。
もちろんメモリを大量に使う前提であれば64ビットが望ましいです。
解決済み
引用返信 編集キー/
■76462 / inTopicNo.16)  Re[9]: Global.asax における静的共有変数の取り扱い
□投稿者/ なちゃ (49回)-(2015/07/13(Mon) 03:11:50)
おそらく単一の文字列で1GBも使うなんてことはちょっと考えられないので、連続メモリ空間ではないだろうとは思いますが。
その場合、試してみるときも実際に使うのと同程度の文字列の長さで試さないと、あまり意味がないことになります。

解決済み
引用返信 編集キー/
■76463 / inTopicNo.17)  Re[10]: Global.asax における静的共有変数の取り扱い
□投稿者/ なちゃ (50回)-(2015/07/13(Mon) 03:18:29)
No76462 (なちゃ さん) に返信
> おそらく単一の文字列で1GBも使うなんてことはちょっと考えられないので、連続メモリ空間ではないだろうとは思いますが。
> その場合、試してみるときも実際に使うのと同程度の文字列の長さで試さないと、あまり意味がないことになります。

あ、もしかしてアルゴリズム上連続メモリを使用する前提なのですかね。
その場合、できれば連続領域は避けて、ある程度小さい文字列を複数という形にすると、メモリ負荷は小さくなります。
もっとも、アプリ起動時に確保であればあまり変わらないか逆効果かもしれませんが。

解決済み
引用返信 編集キー/
■76466 / inTopicNo.18)  Re[11]: Global.asax における静的共有変数の取り扱い
□投稿者/ なちゃ (51回)-(2015/07/13(Mon) 10:40:40)
あともう一つだけ。

アプリケーション変数はおすすめしません。
アプリケーション変数の、static変数に対する唯一のメリットは自動でロックしてくれることくらいですが、これは当たり前ですが良し悪しで、今回のようにおそらくは読みとり専用のデータを共有するには意味がありませんし、パフォーマンスペナルティが大きすぎて使い物にならない可能性が高いでしょう。
オブジェクトの取得時だけなら使い物にならないことはないですが、自動ロックを活用しないという事であり、使う意味もなくなります。

自動でロックしたところでマルチスレッドではアクセスの仕方含めきちんと考えて使わないとまずだめですし、なにも考えずにたまたまうまくいく限られた場面でくらいしかメリットはありません。

正直いってあまりお勧めするような物ではないと思いますよ。
解決済み
引用返信 編集キー/
■76467 / inTopicNo.19)  Re[11]: Global.asax における静的共有変数の取り扱い
□投稿者/ なちゃ (53回)-(2015/07/13(Mon) 10:51:49)
>static 変数を使うことによる種々問題を回避できるよう作ってあるアプリケーション状態を使用すべきと思います。

うーん自動でロックしてくれること以外何かありましたっけ?
自動ロックで問題が解決する場面はかなり限られてますし、これは賛同できません。
解決済み
引用返信 編集キー/
■76480 / inTopicNo.20)  Re[12]: Global.asax における静的共有変数の取り扱い
 
□投稿者/ なちゃ (54回)-(2015/07/13(Mon) 19:37:17)
何度もすみませんが、連続メモリに関してもうちょっと補足。
最近のCLRでは改善されてきてますが、もともと.NETのメモリ管理は巨大な連続領域の利用に弱く、頻繁に確保と解放を繰り返していると、メモリ容量にはまだまだ余裕があるのに、数MBの配列確保ですらメモリエラーになるなんて事がありました。
LOHの断片化とかで調べると出てくるでしょう。

今回はアプリケーション起動時に確保のため、断片化の問題はまず発生しませんと言いたいところなのですが、ASP.NETではアプリケーションの再起動が起きる可能性があるため、同一プロセス内で複数回アプリケーションが起動、一時的に同時に動作することがあります。
こうなると、32ビットでは連続領域的にもそもそものメモリ容量的にもアウトになる可能性が高いでしょう。
もちろん64モードでは状況改善されますし、CLRの進化でも少しずつ改善はされてきています。

開発サーバでエラーが起きたのは、32ビットで動いていたからでしょうね。

解決済み
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -