- PR -

シリアライズのメモリ消費量について

1
投稿者投稿内容
YOSHI.H
会議室デビュー日: 2002/10/25
投稿数: 17
お住まい・勤務地: 福井県福井市
投稿日時: 2003-02-03 23:08
YOSHI.Hです。

DataSetに8,000件程度のデータを詰めて、BinaryFormatterでシリアライズ
しています。

ところが、シリアライズ(下記サンプルコードのA箇所)時にDataSetが使用し
ていると思われるメモリの約20倍程度のメモリが消費されています。約10MB
のデータに対し、約200MBのメモリが消費されている様です。

実行時のメモリ消費を抑えたいのですが、下記の質問。
1.実際、シリアライズ時のメモリ消費量がこんなにあるのか?
2.回避するにはDataSetを分割するしかないのか?
3.MemoryStreamの使用方法が適切なのか?

コード:
Dim バイナリ化 As New BinaryFormatter()
Dim ストリーム As Stream = New MemoryStream()
Dim バイト列() As Byte

Try
  '------------------------------------------------------------------
  '# 簡単な初期化(オブジェクトを直列化した結果のバイト列を作成)
  '------------------------------------------------------------------
  バイナリ化.Serialize(ストリーム, _対象オブジェクト) ' ・・・ A
  ストリーム.Position = 0

  Console.WriteLine("バイト列のサイズ:" & ストリーム.Length)
  ReDim バイト列(ストリーム.Length)
  ストリーム.Read(バイト列, 0, ストリーム.Length)

  〜

二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2003-02-04 00:42
> 実行時のメモリ消費を抑えたいのですが、下記の質問。
> 1.実際、シリアライズ時のメモリ消費量がこんなにあるのか?
> 2.回避するにはDataSetを分割するしかないのか?
> 3.MemoryStreamの使用方法が適切なのか?

なぜ、メモリにストアするMemoryStreamにシリアライズしたデータを書き出しているのでしょうか?
いたずらにメモリ使用量を増やしているとしか思えませんが。

加えて、8000件(10MB)のデータをセットしたDataSetをシリアライズする必要性が本当にあるのかどうかも疑問です。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-02-04 08:30
>>ところが、シリアライズ(下記サンプルコードのA箇所)時にDataSetが使用し
>>ていると思われるメモリの約20倍程度のメモリが消費されています。約10MB
>>のデータに対し、約200MBのメモリが消費されている様です。

 バイナリをダンプしてみました?DataSetを「テキスト」にシリアル化すると、XMLになります。各行に、「どのテーブルの何行目」、列の各要素に「どの列」という情報が付加されています。テーブル名、列名に長い文字列を指定していると、この本来のデータではないデータが大きくなり、自然と消費量も大きくなります。同じことが起こっているのではないでしょうか。

 DataSetは「固定した要素の入れ物ではない」、ということに留意してください。
YOSHI.H
会議室デビュー日: 2002/10/25
投稿数: 17
お住まい・勤務地: 福井県福井市
投稿日時: 2003-02-04 13:05
YOSHI.Hです。

返答ありがとうございます。
Jittaさん、「DataSetは「固定した要素の入れ物ではない」」、おっしゃる通
りですね。
二天さん、ご指摘の通りです。

全体の構成としてシンプルなつくりでは無いだけに方式を見直すことにしまし
た。
1

スキルアップ/キャリアアップ(JOB@IT)