SlideShare a Scribd company logo
1 of 15
Download to read offline
ブログ "Developer@ADJUST"
http://devadjust.exblog.jp/
Twitter: @jsakamoto
こんなシナリオ

   CSV形式の文字列を、オンメモリで生成し
    て、ブラウザに返す .NET3.5 Webアプリ。
   32bit OS / 物理メモリ2GB
   Unicodeで 24MB、1千2百万文字くらいの
    サイズの CSV をオンメモリ生成。
 OutOfMemoryException 発生。
たかだか24MBを生成するのに
何故メモリ不足!?
   StringBuilder に次々と Append すること
    で、CSV 文字列を構築。
   StringBuilder は、容量いっぱいまで充填さ
    れると、今の容量x2倍のメモリ領域を確保、
    充填済みの文字列をコピーすることで伸張。
   つまり、連続したメモリ領域の確保が必要。
   メモリの空き領域が断片化していると伸張
    時に OutOfMemoryException 発生。
さらに LargeObjectHeap の仕様が...

   85KB を越えるオブジェクトは
    LargeObjectHeap と呼ばれる専用のメモリ
    管理下におかれる。
   LOH は (当たり前だが) GC は行われる。
    しかし、コンパクションは行われない。
   LOH に新たなオブジェクトを確保しようと
    すると、LOHに残存する最後尾のオブジェ
    クトのあとに、メモリ領域確保する。
StringBuilder オブ    LOH最後尾に残存し
                    ジェクトにAppned         ている、何かしらの
                    済みの部分               オブジェクト




Large Object Heap



                            StringBuilder オブ
                            ジェクトの容量
out of
memory
テンポラリファイルを使うことも
一瞬考えた。が...
   次々とテンポラリファイルに Write、
    最後にそのテンポラリファイルの内容をブ
    ラウザに返信すれば、メモリ不足例外は発
    生しない。
   しかし、物理メモリ2G積んでるのに、たか
    だか24MBの生成に失敗すること自体、負け
    てる気がして許せなかった。
LinkedList<T>使ってみた

   LinkedList<T> は、連続したメモリ領域を必
    要としない。
     メモリ断片化の影響を受けない。

   CSV生成に成功!
   ...しかし!GC発生時にアプリが応答無しに!
   約12万個のオブジェクトが生成されていた。
List<T>使ってみた

   LinkedList は CSV の素片 string オブジェクト
    に加えて、コンテナも生成される。
     すなわちオブジェクト数が2倍に。
   List<T> で CSV の素片を溜めれば、オブジェ
    クト数は6万個まで抑えられるはず...
   やってみたら、List<T>を伸張するところで
    OutOfMemoryException。
     List<T> も StringBuilder と同じ伸張をするので、
     メモリ断片化か、LOH問題に抵触するほど大きく
     なってしまった模様。
StringBuilder と
LinkedList<T> を組合わせる!
 閾値:85KB 未満の容量を初期指定して、
  StringBuilder のインスタンス生成。
 容量に達するまで StringBuilder に Append。
 容量に達したら、ToString() して
  LinkedList<T>に溜め、StringBuilder は長
  さ 0 にリセット。
 以上を必要なだけ繰り返し。
 LinkedList<T> を ToArray() して
  string.Concat(string[]) で連結して完成!
何かしらのオブ 何かしらのオブ
85KB 未満               ジェクト    ジェクト




          StringBuilder を生成
その他の解決

 64bit OS に載せ替える
 .NET4.0 CLR に載せ替える
 オンメモリにバッファリングしないで、ス
  トリーミングする

More Related Content

More from Jun-ichi Sakamoto

C# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へ
C# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へC# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へ
C# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へJun-ichi Sakamoto
 
Pre-render Blazor WebAssembly on static web hosting at publishing time
Pre-render Blazor WebAssembly on static web hosting at publishing timePre-render Blazor WebAssembly on static web hosting at publishing time
Pre-render Blazor WebAssembly on static web hosting at publishing timeJun-ichi Sakamoto
 
WebAssemblyが切り拓くフロントエンドWeb開発の未来
WebAssemblyが切り拓くフロントエンドWeb開発の未来WebAssemblyが切り拓くフロントエンドWeb開発の未来
WebAssemblyが切り拓くフロントエンドWeb開発の未来Jun-ichi Sakamoto
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはJun-ichi Sakamoto
 
Azure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LT
Azure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LTAzure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LT
Azure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LTJun-ichi Sakamoto
 
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点Jun-ichi Sakamoto
 
C# で Single Page Web アプリを 開発できる Blazor ― その魅力
C# で Single Page Web アプリを開発できる Blazor ― その魅力C# で Single Page Web アプリを開発できる Blazor ― その魅力
C# で Single Page Web アプリを 開発できる Blazor ― その魅力Jun-ichi Sakamoto
 
Azure App Service Authentication
Azure App Service AuthenticationAzure App Service Authentication
Azure App Service AuthenticationJun-ichi Sakamoto
 
ライトニングトーク - とある LINE Bot の開発記「とても腹立たしいことがあったのです」
ライトニングトーク - とある LINE Bot の開発記「とても腹立たしいことがあったのです」ライトニングトーク - とある LINE Bot の開発記「とても腹立たしいことがあったのです」
ライトニングトーク - とある LINE Bot の開発記「とても腹立たしいことがあったのです」Jun-ichi Sakamoto
 
「ゆるくLTをしよう勉強会@旭川」jsakamoto 予告編
「ゆるくLTをしよう勉強会@旭川」jsakamoto 予告編「ゆるくLTをしよう勉強会@旭川」jsakamoto 予告編
「ゆるくLTをしよう勉強会@旭川」jsakamoto 予告編Jun-ichi Sakamoto
 
Ohotech特盛#14 セッション4 予告編
Ohotech特盛#14 セッション4 予告編Ohotech特盛#14 セッション4 予告編
Ohotech特盛#14 セッション4 予告編Jun-ichi Sakamoto
 
CLR/H 第99回勉強会ライトニングトーク
CLR/H 第99回勉強会ライトニングトークCLR/H 第99回勉強会ライトニングトーク
CLR/H 第99回勉強会ライトニングトークJun-ichi Sakamoto
 
Ohotech特盛#13 スマホで操作する カメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―
Ohotech特盛#13 スマホで操作するカメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―Ohotech特盛#13 スマホで操作するカメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―
Ohotech特盛#13 スマホで操作する カメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―Jun-ichi Sakamoto
 
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!Jun-ichi Sakamoto
 
息子たちがローマ字勉強するための &lt;s>HTML5&lt;/s> Web標準 アプリ作ってみた
息子たちがローマ字勉強するための &lt;s>HTML5&lt;/s> Web標準 アプリ作ってみた息子たちがローマ字勉強するための &lt;s>HTML5&lt;/s> Web標準 アプリ作ってみた
息子たちがローマ字勉強するための &lt;s>HTML5&lt;/s> Web標準 アプリ作ってみたJun-ichi Sakamoto
 
More Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトーク
More Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトークMore Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトーク
More Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトークJun-ichi Sakamoto
 
One horror stories around NuGet
One horror stories around NuGetOne horror stories around NuGet
One horror stories around NuGetJun-ichi Sakamoto
 
How to automated test a web application with sending e mail feature
How to automated test a web application with sending e mail featureHow to automated test a web application with sending e mail feature
How to automated test a web application with sending e mail featureJun-ichi Sakamoto
 
Introduction of "MarkdownPresenter"
Introduction of "MarkdownPresenter"Introduction of "MarkdownPresenter"
Introduction of "MarkdownPresenter"Jun-ichi Sakamoto
 
セッション中に Twitter につぶやく!
セッション中に Twitter につぶやく!セッション中に Twitter につぶやく!
セッション中に Twitter につぶやく!Jun-ichi Sakamoto
 

More from Jun-ichi Sakamoto (20)

C# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へ
C# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へC# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へ
C# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へ
 
Pre-render Blazor WebAssembly on static web hosting at publishing time
Pre-render Blazor WebAssembly on static web hosting at publishing timePre-render Blazor WebAssembly on static web hosting at publishing time
Pre-render Blazor WebAssembly on static web hosting at publishing time
 
WebAssemblyが切り拓くフロントエンドWeb開発の未来
WebAssemblyが切り拓くフロントエンドWeb開発の未来WebAssemblyが切り拓くフロントエンドWeb開発の未来
WebAssemblyが切り拓くフロントエンドWeb開発の未来
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 
Azure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LT
Azure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LTAzure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LT
Azure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LT
 
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点
 
C# で Single Page Web アプリを 開発できる Blazor ― その魅力
C# で Single Page Web アプリを開発できる Blazor ― その魅力C# で Single Page Web アプリを開発できる Blazor ― その魅力
C# で Single Page Web アプリを 開発できる Blazor ― その魅力
 
Azure App Service Authentication
Azure App Service AuthenticationAzure App Service Authentication
Azure App Service Authentication
 
ライトニングトーク - とある LINE Bot の開発記「とても腹立たしいことがあったのです」
ライトニングトーク - とある LINE Bot の開発記「とても腹立たしいことがあったのです」ライトニングトーク - とある LINE Bot の開発記「とても腹立たしいことがあったのです」
ライトニングトーク - とある LINE Bot の開発記「とても腹立たしいことがあったのです」
 
「ゆるくLTをしよう勉強会@旭川」jsakamoto 予告編
「ゆるくLTをしよう勉強会@旭川」jsakamoto 予告編「ゆるくLTをしよう勉強会@旭川」jsakamoto 予告編
「ゆるくLTをしよう勉強会@旭川」jsakamoto 予告編
 
Ohotech特盛#14 セッション4 予告編
Ohotech特盛#14 セッション4 予告編Ohotech特盛#14 セッション4 予告編
Ohotech特盛#14 セッション4 予告編
 
CLR/H 第99回勉強会ライトニングトーク
CLR/H 第99回勉強会ライトニングトークCLR/H 第99回勉強会ライトニングトーク
CLR/H 第99回勉強会ライトニングトーク
 
Ohotech特盛#13 スマホで操作する カメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―
Ohotech特盛#13 スマホで操作するカメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―Ohotech特盛#13 スマホで操作するカメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―
Ohotech特盛#13 スマホで操作する カメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―
 
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
 
息子たちがローマ字勉強するための &lt;s>HTML5&lt;/s> Web標準 アプリ作ってみた
息子たちがローマ字勉強するための &lt;s>HTML5&lt;/s> Web標準 アプリ作ってみた息子たちがローマ字勉強するための &lt;s>HTML5&lt;/s> Web標準 アプリ作ってみた
息子たちがローマ字勉強するための &lt;s>HTML5&lt;/s> Web標準 アプリ作ってみた
 
More Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトーク
More Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトークMore Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトーク
More Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトーク
 
One horror stories around NuGet
One horror stories around NuGetOne horror stories around NuGet
One horror stories around NuGet
 
How to automated test a web application with sending e mail feature
How to automated test a web application with sending e mail featureHow to automated test a web application with sending e mail feature
How to automated test a web application with sending e mail feature
 
Introduction of "MarkdownPresenter"
Introduction of "MarkdownPresenter"Introduction of "MarkdownPresenter"
Introduction of "MarkdownPresenter"
 
セッション中に Twitter につぶやく!
セッション中に Twitter につぶやく!セッション中に Twitter につぶやく!
セッション中に Twitter につぶやく!
 

CLR/H第63回勉強会ライトニングトーク

  • 2. こんなシナリオ  CSV形式の文字列を、オンメモリで生成し て、ブラウザに返す .NET3.5 Webアプリ。  32bit OS / 物理メモリ2GB  Unicodeで 24MB、1千2百万文字くらいの サイズの CSV をオンメモリ生成。  OutOfMemoryException 発生。
  • 3. たかだか24MBを生成するのに 何故メモリ不足!?  StringBuilder に次々と Append すること で、CSV 文字列を構築。  StringBuilder は、容量いっぱいまで充填さ れると、今の容量x2倍のメモリ領域を確保、 充填済みの文字列をコピーすることで伸張。  つまり、連続したメモリ領域の確保が必要。  メモリの空き領域が断片化していると伸張 時に OutOfMemoryException 発生。
  • 4. さらに LargeObjectHeap の仕様が...  85KB を越えるオブジェクトは LargeObjectHeap と呼ばれる専用のメモリ 管理下におかれる。  LOH は (当たり前だが) GC は行われる。 しかし、コンパクションは行われない。  LOH に新たなオブジェクトを確保しようと すると、LOHに残存する最後尾のオブジェ クトのあとに、メモリ領域確保する。
  • 5.
  • 6. StringBuilder オブ LOH最後尾に残存し ジェクトにAppned ている、何かしらの 済みの部分 オブジェクト Large Object Heap StringBuilder オブ ジェクトの容量
  • 8. テンポラリファイルを使うことも 一瞬考えた。が...  次々とテンポラリファイルに Write、 最後にそのテンポラリファイルの内容をブ ラウザに返信すれば、メモリ不足例外は発 生しない。  しかし、物理メモリ2G積んでるのに、たか だか24MBの生成に失敗すること自体、負け てる気がして許せなかった。
  • 9. LinkedList<T>使ってみた  LinkedList<T> は、連続したメモリ領域を必 要としない。  メモリ断片化の影響を受けない。  CSV生成に成功!  ...しかし!GC発生時にアプリが応答無しに!  約12万個のオブジェクトが生成されていた。
  • 10. List<T>使ってみた  LinkedList は CSV の素片 string オブジェクト に加えて、コンテナも生成される。  すなわちオブジェクト数が2倍に。  List<T> で CSV の素片を溜めれば、オブジェ クト数は6万個まで抑えられるはず...  やってみたら、List<T>を伸張するところで OutOfMemoryException。  List<T> も StringBuilder と同じ伸張をするので、 メモリ断片化か、LOH問題に抵触するほど大きく なってしまった模様。
  • 11.
  • 12. StringBuilder と LinkedList<T> を組合わせる!  閾値:85KB 未満の容量を初期指定して、 StringBuilder のインスタンス生成。  容量に達するまで StringBuilder に Append。  容量に達したら、ToString() して LinkedList<T>に溜め、StringBuilder は長 さ 0 にリセット。  以上を必要なだけ繰り返し。  LinkedList<T> を ToArray() して string.Concat(string[]) で連結して完成!
  • 13. 何かしらのオブ 何かしらのオブ 85KB 未満 ジェクト ジェクト StringBuilder を生成
  • 14.
  • 15. その他の解決  64bit OS に載せ替える  .NET4.0 CLR に載せ替える  オンメモリにバッファリングしないで、ス トリーミングする