2017-05-15 8 views
1

問題があります:xml(20GB)をシリアル化したいのですが、out of memory例外が発生します。XMLシリアライズ - BIGデータ(20GB)、OutOfMemoryException

ご意見はありますか?

私が持っていたコードは以下の通りです:

public static string Serialize(object obj) 
{ 
    string retval = string.Empty; 

    if (null!= obj) 
    { 
     StringBuilder sb = new StringBuilder(); 
     using (XmlWriter writer = XmlWriter.Create(sb, new XmlWriterSettings() { OmitXmlDeclaration = true })) 
     {      
      XmlSerializer serializer = new XmlSerializer(obj.GetType()); 

      // We are ommitting the namespace to simplifying passing as parameter 
      XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
      ns.Add("", ""); 

      serializer.Serialize(writer, obj); 
     } 

     retval = sb.ToString(); 
    } 
    return retval; 
} 
+2

フラッシュ、一括書き込み。 – Karolis

+0

@Karolis Thxは速い応答のために、あなたに私に例を与えることができますか?それをどうしたらいいですか?私はそれを使用する方法を正確に知っていません –

+0

申し訳ありません、今すぐトピックに展開することはできません。必要な場合は、後で詳しく説明します。 – Karolis

答えて

3

20ギガバイトは(StringBuilder経由)stringとして仕事に行く決してです。 <gcAllowVeryLargeObjects>を有効にしても、理論上の最大長はstringと非常に小さいです。

巨大なデータが必要な場合は、ファイル(またははMemoryStreamではないもの)をバックエンドとして使用する必要があります。

また、xmlは大きなデータのためのひどい選択であると言います。 xmlに縛られていない場合は、代替ツールを見ることを強くお勧めします(オプションの場合は、アドバイスを提供しています)。

しかし、今の

string path = "my.xml"; 
XmlWriterSettings settings = ... 
using (XmlWriter writer = XmlWriter.Create(path, settings)) 
{ 
    // ... 
} 

またはあなたが実際にソケットなどに話をしている場合:あなたはおそらく作品でそれを行うためのリストを持っている

Stream stream = ... 
XmlWriterSettings settings = ... 
using (XmlWriter writer = XmlWriter.Create(stream, settings)) 
{ 
    // ... 
} 
+0

私はこれを試してみると、私はフィードバックthxと一緒に来るでしょう。 –

+0

ありがとうございます。私はローカルの.xmlファイルを作成しましたが、OLEDBエラー "System resourse exceeded"に問題がありましたが、修正を見つける –

0

 public static void Serialize(List<MyClass> myClasses) 
     { 
      string retval = string.Empty; 

      if (myClasses != null) 
      { 

       using (StreamWriter sWriter = new StreamWriter("filename", false)) 
       { 
        foreach (MyClass myClass in myClasses) 
        { 

         StringBuilder sb = new StringBuilder(); 
         using (XmlWriter writer1 = XmlWriter.Create(sb, new XmlWriterSettings() { OmitXmlDeclaration = true })) 
         { 
          XmlSerializer serializer = new XmlSerializer(myClass.GetType()); 

          // We are ommitting the namespace to simplifying passing as parameter 
          XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
          ns.Add("", ""); 

          serializer.Serialize(writer1, myClass); 
         } 
         sWriter.Write(sb.ToString()); 

        } 

       } 
      } 
     } 
+1

そのコードは複数のルート要素を持つXMLファイルを作成します。 –

+0

はい。しかし、開閉タグを書き込むように変更することができます。 – jdweng

関連する問題