Visual Basic .NETの文字列(String)は不変(immutable)です。連結などの操作は既存の文字列を変更するのではなく、新しい文字列を作成します。大量の文字列を連結/変更する場合、パフォーマンスが大幅に低下し、メモリ消費が増加します。
大量のテキストを扱う場合は、文字列を効率的に操作するための特別なクラスを使用することをお勧めします。Visual Basic .NETでは、System.Text.StringBuilderを使用すると、新しいメモリを継続的に割り当てることなく文字列バッファを変更できます。
StringBuilderの例:
Imports System.Text Dim builder As New StringBuilder() For i As Integer = 1 To 100000 builder.Append("文字列 " & i & vbCrLf) Next Dim result As String = builder.ToString()
質問:「大きなテキストファイルを扱う際に、&演算子を使って単に文字列を結合してパフォーマンスを心配しなくてもいいですか?」
回答: いいえ。ループ内で&を使用して文字列を結合すると、各イテレーションで新しい文字列オブジェクトが作成され、その全ての文字が追加でコピーされます。これでは大量のデータに対して非効率的です。StringBuilderを使用する方が良いです。
例:
' このコードはNが大きい場合非常に遅い: Dim s As String = "" For i = 1 To 1000000 s = s & "a" Next ' こちらの方がはるかに速い: Dim sb As New StringBuilder() For i = 1 To 1000000 sb.Append("a") Next Dim s = sb.ToString()
話:
ウェブアプリケーションで、プロジェクトは
&による通常の文字列連結を使用してeメール配信を構築していました。10,000件を超えるメッセージになると、システムは"ハング"し、メモリ不足でクラッシュしました。StringBuilderに移行した後、これらの問題は解消されました。
話:
エラーログの手続きでは、通常の加算を通じて文字列を何度も追加することでログが構築されていました。これは、ログの記録時間を大幅に増加させ、パーサー全体の動作を遅くしました。監査とStringBuilderを使用したリファクタリングの後、処理速度が5倍に向上しました。
話:
人気のあるXLSファイルでレポートを生成する際、アナリストは単純なアプローチを選び、すべての値を
&で1つの文字列に結合しました。結果:10,000行のレポートを生成する際にアプリケーションが応答しなくなりました。StringBuilderへの置き換えがパフォーマンスとメモリ漏れの問題を解決しました。