タイトル | : Re: Stringの連結 |
記事No | : 11561 |
投稿日 | : 2015/12/23(Wed) 07:24 |
投稿者 | : 花ちゃん |
マルチポストですか? 当サイトをご利用になるのならマナーは守って下さいネ。
私は、そのような経験もないし、詳しくもないのですが、問題に対して情報が少ないように思われます。
> VB.netでのWindowsアプリケーション開発をしています。 これでは、開発環境や VB のバージョンすら判断できません。 VB.NET 2003 ですか? http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=243&no=8
> String文字列の連結においてOutofMemory.Exceptionのエラーがスローされます。 > 手法としてはSingleの数値をカンマで区切り、1000個のカンマ区切り文字列を作成します。 > その文字列は「temp_Str as String」の変数に格納していくのですが、 どのように連結されておられるのでしょうか? 単純に & 演算子での連結ですか? 他の連結方法でも同様に発生しますか? (時間がかかっているようなので? プログラムの内容が気になって。)
> 大型のループ処理で10万件以上作成されたところで上記のエラーが発生します。 > (時間にして2〜3時間程度経過した時点) どの位のメモリを消費した時点ですか? 保存した文字列の量はどの位の場面で? メモリの関係の話なのにどこでメモリをどの位使っているとか、その辺の情報が?
> 少なくとも数100万件の処理を行いたいのですが、 目的の 10% 程度の処理で OutofMemory が発生するようなら処理を10回以上に分割するなど 根本的に見直さないと解決できないように思いますが。
以下、私の環境での単純テスト結果 (Windows 8.1 64ビット RAM = 8GB VB2015 対象の CPU:x64 ※ x86 ではこれよりかなり下回ります)
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim tmp As New System.Text.StringBuilder() For i = 1 To 1000 tmp.Append("123456.12 ,") Next Console.WriteLine(tmp.ToString.Length) '11000 Dim sb As New System.Text.StringBuilder() For i = 1 To 97610 'この辺が限度(String型への代入) sb.Append(tmp) Next Dim tmp1 As String = sb.ToString 'Console.WriteLine(System.GC.GetTotalMemory(False)) Console.WriteLine(tmp1.Length) '1073710000 Console.WriteLine(System.Text.Encoding.Unicode.GetByteCount(tmp1)) '2147420000 End Sub
一部 サイトで String 型は、20億個の文字まで格納できると記載されているが、この実験結果でも 下記の MSDN のサイトに書かれている記事でも、2GB (x64 の場合)に制限されている(OS にもよる)ように思えます。 (正確には、Dim st As New String(Chr(0), 1073741791) が限度でした) 但し、StringBuilder への格納は、2147483647 文字まで(約 20億個の文字)格納できました。
https://msdn.microsoft.com/ja-jp/library/cc435638(v=vs.71).aspx
|