【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言

VB.netでのWindowsアプリケーション開発をしています。
String文字列の連結においてOutofMemory.Exceptionのエラーがスローされます。

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

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

A 回答 (2件)

○今の具体的な方法は?


 例えば
  temp_Str &= 〜
  temp_Str = temp_Str & 〜
 などとやっているなら、StringBuilderで効率がよくなるかもしれません。
※ & で連結する場合、内部では「 旧文字列 & 連結する文字列」 という新しい文字列オブジェクトを作ります。
 効率はよくはありません。

○本当に文字列が原因ですか?
 例えば

For j = 1 To 数100万件
 temp_Str =""
 For i = 1 To 1000
  データ処理
  temp_Str &= "〜,"
 Next
 temp_Strの出力
Next

 みたいな構造で、毎回temp_Strがクリアされているなら、文字列がメモリ不足の原因になるとは思えません。
 この中の「データ処理」の方が原因だったりしませんか?
 例えば、1回ループする度に、データ取得や計算用に作られたオブジェクトがGCされないまま残っている、とか。

 あるいは「 temp_Strの出力」 の部分が「配列やListに追加」とか「TextBox1.Textに追加」とかだったら、ループ毎に使用メモリが増えていくことになります。
都度ファイルやデータベースに書き出すのがよいでしょう。


まずは、原因をちゃんと調べることです。
まずは、データ処理をばっさりコメントアウトして「 temp_Str にカンマ区切りの数値を連結」だけにしても発生するのか調べてみましょう。
VisualStudioにパフォーマンスツールが付いているなら、それを使うのも手です。
http://www.atmarkit.co.jp/fdotnet/chushin/vsperf …
    • good
    • 0

一般論だが, 「メモリの消費を減らすような処理方法を考える」べきだと思うぞ.

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報