2013-11-21 8 views
5

私は、データベース(Oracle 11g Unicode)テーブルのエクスポートの結果としてXMLファイルを持っています。 このテーブルには、ファイルを表すBLOBフィールドがあります。このファイルは非常に大きなファイルである可能性があります。非常に大きな文字列でバイト配列

私は非常に大きなファイルを持っているので、XMLでそのファイルの非常に大きな文字列表現を取得します。

別のデータベースインスタンスにファイルを挿入するには、この文字列のバイトを取得する必要があります。

この時点では、XMLが課金され、ファイルを表す文字列があります。

私がやったことはこれです:

Encoding.Unicode.GetBytes(stringFileRepresentation);

しかし、私はOutOfMemoryExceptionを取得しています。

私が行う場合は、この:

Encoding.Unicode.GetBytes(stringFileRepresentation.ToCharArray());

私もOutOfMemoryExceptionを取得します。

私は、文字列をデコードする前にこれを行うには、あまりにも試してみました:

var chars = stringFileRepresentation.ToCharArray(); 
Encoding.Unicode.GetBytes(chars); 

そしてToCharArray()を呼び出すときに、私はOutOfMemoryExceptionを得ます。

だから私は処理のの文字列が問題になると思います。

その後、私は、私は、私は、文字列のエンコーディングをconservateする必要がわからない場合、私はhereイベントを見つけ、次の方法しようとしている:

byte[] bytes = new byte[str.Length * sizeof(char)]; 
Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); 

をしかし、私はまた、インスタンス化でOutOfMemoryExceptionを取得していますbytes変数。

今、私はOutOfOptionsを実行しました。私は何をすべきか分かりません。

+1

バイト配列を取得した後、どのようにblobをデータベースに書き出しますか?ストリーミングオプションはありますか? (理想的には、文字列としてもファイル全体をメモリに保存する必要はありません...) –

+2

2つのデータベースを直接お互いに話す方法を探してください。 – samjudson

+0

私はODP.NETを見て始めました。私はストリーミングオプションを見ません。これはあなた自身でチャンクに分割し、データベースにフィールドを追加する必要があるようです。現在のフィールドにバイトを追加するSPROCを作成し、オブジェクト全体を挿入するまでチャンクを挿入するループを作成します。 – Wjdavis5

答えて

4

あなたは既にメモリにオリジナルの完全な文字列を持っているので、あなたはそれをバッファリングするためにStringReaderを使用することができます。

これは、ファイルにテキストを取得します。同様の手法を使用して、ファイルではなく別のストリームに書き込むことができます。ファイル以外のものへの書き込み

using (var sr = new StringReader(fileContents)) 
{ 
    using (var outputWriter = new StreamWriter(@"C:\temp\output.txt")) 
    { 
     char[] buffer = new char[10]; 
     int numChars; 
     while ((numChars = sr.ReadBlock(buffer, 0, buffer.Length)) > 0) 
     { 
      outputWriter.Write(buffer, 0, numChars); 
     } 
    } 
} 

EDIT

はかなり似ている - たとえば、あなたがストリーム(ストリームのどのような問題ではありませんに直接書きたかったと仮定 - かもしれませんメモリストリーム、HttpResponseストリーム、FileStreamなど):

using (var sr = new StringReader(fileContents)) 
{ 
    using (var outputStream = GetSomeStreamFromSomewhere()) 
    { 
     char[] buffer = new char[10]; 
     int numChars; 
     while ((numChars = sr.ReadBlock(buffer, 0, buffer.Length)) > 0) 
     { 
      char[] temp = new char[numChars]; 
      Array.Copy(buffer, 0, temp, 0, numChars); 
      byte[] byteBuffer = Encoding.UTF8.GetBytes(temp); 
      outputStream.Write(byteBuffer, 0, byteBuffer.Length); 
     } 
    } 
} 
+0

文字列はすでにファイルから来ていますので、ファイルに再入力すると便利ではありません。ありがとう、結構です! – sabotero

+0

私はあなたが持っているコンテンツを使って何をしているのか分かりません。うまくいけば、それを最終的な宛先にチャンクで書き込むいくつかの方法があります。その場合、 'StreamWriter'の代わりに、最終目的地に接続されている他のストリームを開いてから、charバッファを小さなバイト配列に変換し、そのバイト配列をストリームに書き込みます。 .NETストリームはほとんどの場合互換性があるため、コードは似ています。 –

+0

私は間にDevartを使用して、Oracleデータベースにコンテンツを書き込もうとしています。 – sabotero