7

データベース (nvarchar) から大きな Unicode テキスト文字列 (200Mb など) を取得し、処理のためにメモリに格納する必要があります。つまり、文字列のすべての部分へのランダム アクセスが必要です。

これを厳密にメモリ中心の観点から見ると、メモリ内表現として System.IO.MemoryStream と System.String を使用することの長所と短所は何ですか。

私が研究しようとしているいくつかの要因は次のとおりです。

  • これらのオブジェクトが[仮想の]高度に断片化された低メモリ環境でどのように機能するか
  • 不変性
  • メモリ内の実際のサイズ (ストリームが UTF8 の場合、サイズはほぼ半分になります)
  • 私が考えたことのない別のオブジェクトはありますか?

これらの点に関する明確さとアドバイス、および私が考えていなかったその他のメモリに関する考慮事項を探していますか?

注: これらの文字列を処理するより良い方法があるかもしれませんが、現時点では、そのようなオブジェクトを格納する際のメモリの考慮事項について質問しているだけです。

4

2 に答える 2

6

これを厳密にメモリ中心の観点から見ると、メモリ内表現として System.IO.MemoryStream と System.String を使用することの長所と短所は何ですか。

私が研究しようとしているいくつかの要因は次のとおりです。

  • これらのオブジェクトが[仮想の]高度に断片化された低メモリ環境でどのように機能するか

IMO、MemoryStream は、エンコーディングが簡単な場合 (ASCII、ISO-8859-X など) にのみ役立ちます。エンコーディングが UTF-8で、非 ASCII 文字がある場合、処理はより困難になります。確かに、ほぼ確実に MemoryStream の方がメモリの消費量は少なくなりますが、それ以外は大きな違いはありません。内部では、MemoryStream はバイト配列を使用しますが、これもメモリの連続したチャンクに割り当てる必要があります。

  • メモリ内の実際のサイズ (ストリームが UTF8 の場合、サイズはほぼ半分になります)

そうです、純粋な ASCII 文字では、MemoryStream は同等の文字列が消費する量の半分を消費します。

  • 私が考えたことのない別のオブジェクトはありますか?
List<byte> // has a nicer interface for processing

文字列はデータベースにどのように格納されますか? varchar または nvarchar?

よろしく、

アンドレアス

于 2008-12-29T09:32:22.173 に答える
4

文字列とストリームのメモリは、まったく重要ではありません。文字列は utf-16 であるため、小さな倍数が含まれる可能性がありますが、ボリュームが関係するため、データをスクラッチ ファイルに書き込むことをお勧めします

データベースからデータを読み取るには、ストリーミング手法を使用します。つまり、シーケンシャル モードで IDataReader (ExecuteReader) を使用し、バイト/文字のチャンクを読み取ります。コラム全体を読もうとしないでください。

また、SQL Server 2008 では、ファイル ストリーム タイプを調べたいと思うかもしれません。

例:

于 2008-12-29T09:42:15.630 に答える