tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルStringの連結
記事No11559
投稿日: 2015/12/22(Tue) 13:40
投稿者nbx1508
VB.netでのWindowsアプリケーション開発をしています。
String文字列の連結においてOutofMemory.Exceptionのエラーがスローされます。

手法としてはSingleの数値をカンマで区切り、1000個のカンマ区切り文字列を作成します。
その文字列は「temp_Str as String」の変数に格納していくのですが、
大型のループ処理で10万件以上作成されたところで上記のエラーが発生します。
(時間にして2〜3時間程度経過した時点)

少なくとも数100万件の処理を行いたいのですが、
うまくメモリー管理をする方法はないでしょうか?
今現在GC.CollectやRemove等の処理は入れているのですが、あまり効果がありません。
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: Stringの連結
記事No11561
投稿日: 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

[ツリー表示へ]