QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

String変数の最大格納文字数

お世話になっております。

StringBuilder変数は最大格納サイズはがInt32.MaxValueであるとMSDNにありますが、String変数の最大格納サイズはどのくらいのないか教えて下さい。
現在、StringBuilder変数を使用して最大格納サイズを変更しなかったので、バッファオーバーになってしまいました。
StringBuilder変数の最大格納サイズを変更すればよいのか、もしくはStringBuilderではなくString変数に変更したほうがいいのか悩んでおります。
ほかになにかいい案があればご教授願います。

質問者:ちびぐま

回答

StringBuilderの最大サイズを超えるようなデータを処理しようとしているのですか?その場合、

2(Charのサイズ) * Int32.MaxValue = 約4GB

です。何を使おうがメモリ中でやろうとすると、現状物理的に難しいですし、32bitシステムではどっちにしろ難しいです。Streamを使いチョコチョコと処理するとか、工夫しなければだめです。

投稿者:ya

編集 履歴 (0)

このあたりの話ですかねぇ?

StringBuilder クラス

実装時の注意: この実装の既定容量は 16 で、既定の最大容量は Int32.MaxValue です。

StringBuilder は、インスタンスの値が大きくなった場合に、文字を格納するために必要なより多くのメモリを割り当てることができます。それに応じて容量が調整されます。割り当てられたメモリの量が実装固有で、必要なメモリ量が最大容量より大きい場合は、 ArgumentOutOfRangeException がスローされます。

投稿者:Jitta

編集 履歴 (0)

ご返信ありがとうございます。
StringBuilderを既定容量の16で使用していたためエラーが発生してしまいました。
DBに格納されている複数のデータをファイルに書き出す処理をしていて、DBのデータをStringBuilderに突っ込んで、一気にファイルに書き出そうとしてました。
yaさんの言う通りStreamを使用することにします。
ありがとうございました。

投稿者:ちびぐま

編集 履歴 (0)

ちびぐまさんの書き込み (2004-09-28 14:28) より:

StringBuilderを既定容量の16で使用していたためエラーが発生してしまいました。

既定は16ですけど、これは勝手に倍々と増えていきます。
そのため、既定容量で使用していたからエラーがでた、というのも
おかしいように思います。
どこか別の原因なんじゃないですかね。

#エラーの内容も詳しくはわからないので、なんともいえないですが。

投稿者:小野@どっとねっとふぁん

編集 履歴 (0)

Exceptionのエラーメッセージにはエラーパラメータ:repeatcount
と出力されていましたので、StringBuilderの容量オーバーだと思ったのですが。。。
このエラーメッセージに何か心当たりはありますか?

投稿者:ちびぐま

編集 履歴 (0)

正確なエラーメッセージと、そのエラーが発生する周辺のプログラムぐらいは
提示されないと何ともいえないですね。
判断するための情報が少なすぎます。
[ メッセージ編集済み 編集者: 小野@どっとねっとふぁん 編集日時 2004-09-28 17:43 ]

投稿者:小野@どっとねっとふぁん

編集 履歴 (0)

こんにちは。

(素朴な疑問なのですが)
バッファオーバーであると思われた際に、変数に格納していたバイト数は
どのくらいだったのでしょう。。。?

投稿者:Qoo

編集 履歴 (0)

小野@どっとねっとふぁんさんの書き込み(2004-09-28 15:54)より:

既定は16ですけど、これは勝手に倍々と増えていきます。

 引用しているMSDNによると、デフォルトコンストラクタの場合は増えません・・・と、読み解きました↓

StringBuilder のインスタンスが初期化されるときに、容量または最大容量が指定されなかった場合は、実装に固有の既定の容量が使用されます。

割り当てられたメモリの量が実装固有で、必要なメモリ量が最大容量より大きい場合は、 ArgumentOutOfRangeException がスローされます。

が、例外の内容がわからないのでは、何とも言えませんけど。RepeatCountなんてパラメータは、StringBuilderに定義されてなさそうですから、他の部分で発生していませんか?>ちびぐまさん

投稿者:Jitta

編集 履歴 (0)

StringBuilder.Append(Char,int)のタイプのAppendを使っていますか?
一応、intに変な値をいれたときに「ArgumentOutOfRangeException
パラメータ名:repeatCount」ってエラーを見たことがあります。ただ、
小さすぎるとがんばってAppendしようとするし、大きすぎると「十分なメモリが
ありませんでした」とか言われ、条件は微妙でした。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemtextstringbuilderclassappendtopic17.asp
エラー情報では、メソッドのパラメータ名は内部で勝手に決まってるものを
出しますね。

CapacityプロパティとMaxCapacityプロパティがあって、Capacityを超えると
自動的にサイズを大きくしてくれるけど
StringBuilder(capacity,maxCapacity);
で指定した(あるいは既定の)maxCapacityは超えられない、という感じでしょうか。

ただ、一体どれくらいの大きさの文字列を作ろうとしたのでしょうか・・

投稿者:べる

編集 履歴 (0)

べるさんの指摘通りです。
エラーメッセージは「パラメータ名:repeatCount 0未満には設定できません」
というものです。
出力しようとしていたのは160万文字くらいのものだと思います。
実際にどのくらいの文字数なのかはわかっておりません。
10万文字くらいのデータを削除したら正常に動作しました。
今のところデータを削除して正常に動いているのでプログラム修正はしていない状態です。

投稿者:ちびぐま

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。