2016-10-26 10 views
-1

私は長さが1539,121,968のStringBuilderを持っています。 StringBuilder .ToString()を呼び出すと、OutOfMemoryExceptionで失敗します。私はchar配列を作成しようとしましたが、そのような大きな配列を作成することはできませんでした。非常に大きなstringbuilderからUTF8.GetBytesを取得します

バイト配列をUTF8形式で格納する必要があります。出来ますか?

+6

このような巨大なStringBuilderの構築を避けることができますか?これを流すことは可能ですが、それは相当量の作業です...あなたのアプローチを再考する方が良いかもしれません。 –

+2

.NET内の単一のオブジェクトの最大サイズは2GBです。ただし、[this](https://msdn.microsoft.com/en-us/library/hh285054(v = vs.110).aspx)を参照してください。 – itsme86

+3

このようなStringBuilderを作成しないでください。それはその仕事ではありません。 StringBuilderは、バッファとして動作するのではなく、文字列の作成を容易にするためのものです。 UTF8エンコーディングで 'StreamWriter'を使用して、目的のものを出力してください。ディスクへの書き込みが多すぎる場合は、大きなバッファを使用してください。デフォルトは8KBだと思います –

答えて

2

ストリームのドキュメントを参照することをおすすめします。これが助けるかもしれないので。

もう1つの方法は、それを分割することです。 UTF8でByteArrayとして保存したいという最後のコメントについては、char[]が必要です。そうしないと、エンコードが失われる可能性があります。私は簡単に再構成することができる別のオブジェクトに格納されている多くの小さな文字列(またはchar[])に分割することをお勧めします。このような何か、多くのStringSliceの作成、十分かもしれません:あなたはここでやっているだろうか本質的には

public class StringSlice() 
{ 
    public Str {get;} 
    public Index {get;} 
    public StringSlice(string str, int index) 
     { 
       this.Str = str; 
       this.Index = index; 
     } 

    public static List<string> ReconstructString(IEnumerable<StringSlice> parts) 
     { 
       //Sort input by index return list with new strings in order. Probably have to use a buffer on the disc so as not to breach 2GB obj limit. 
     } 
} 

は、インターネットパケットを分割して再構築されている方法に類似しています。私はあなたの質問に答えているのかどうかははっきりしていませんが、うまくいけば、これは何か助けになるでしょう。

関連する問題