StringReader reuse for XML Parsing in C#XML schema parsing and XML creation from flat filesParsing XML in PythonXmlCmdBuilder - doing away with inline xmlObject to object mapping verification - is this extension method useful?XML parsing in Java using SAX parserXML/HTML Read/WriteGeneric methods for serializing and deserialzing xml files using streamsParse child value from XML using ezxmlAnalyze Shakespeare's Macbeth parsing XML from web using NokogiriParsing XML documents with LXML

Why is "Reports" in the sentence below without the article "The"?

Wild Shape Centaur Into a Giant Elk: do their Charges stack?

Symmetry in quantum mechanics

Process builder are scheduled actions independent?

Least quadratic residue under GRH: an explicit bound

Latin words with no plurals in English

How to handle columns with categorical data and many unique values

Could a US political party gain complete control over the government by removing checks & balances?

Extreme, but not acceptable situation and I can't start the work tomorrow morning

How to deal with fear of taking dependencies

What do you call something that goes against the spirit of the law, but is legal when interpreting the law to the letter?

Some basic questions on halt and move in Turing machines

Sort in WP_Query(), not filter? Is it possible?

How do you conduct xenoanthropology after first contact?

Denied boarding due to overcrowding, Sparpreis ticket. What are my rights?

cryptic clue: mammal sounds like relative consumer (8)

How to answer pointed "are you quitting" questioning when I don't want them to suspect

Why do UK politicians seemingly ignore opinion polls on Brexit?

What kind of transistor turns on with 0.2 volts?

Can you lasso down a wizard who is using the Levitate spell?

Is there a familial term for apples and pears?

DOS, create pipe for stdin/stdout of command.com(or 4dos.com) in C or Batch?

Is domain driven design an anti-SQL pattern?

A newer friend of my brother's gave him a load of baseball cards that are supposedly extremely valuable. Is this a scam?



StringReader reuse for XML Parsing in C#


XML schema parsing and XML creation from flat filesParsing XML in PythonXmlCmdBuilder - doing away with inline xmlObject to object mapping verification - is this extension method useful?XML parsing in Java using SAX parserXML/HTML Read/WriteGeneric methods for serializing and deserialzing xml files using streamsParse child value from XML using ezxmlAnalyze Shakespeare's Macbeth parsing XML from web using NokogiriParsing XML documents with LXML






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








0












$begingroup$


I'm developing a generic XML Parser that would parse chunks of a given XML to a given list of types by using the "Pull parsing" approach, which I think is more "memory efficient/predictable", instead of loading unknown-sized XML files into memory.



I'm caching the XmlSerializer objects for the given types and the last bit that I'm concerned is the following:



The Deserialize method from XmlSerializer expects a Stream. To accomplish that, for each object that matches the criteria, I'm creating a new StringReader.



My concern is: If I parse an arbitrarily big XML file, for each object that meets the criteria I'll be creating a new StringReader object. This is a "short-lived" object and for sure I'll get lots of GC calls to deal with dangling StringReader objects, which I guess that may be harmful, performance-wise.



I have the following questions:



  • Is there a way to recycle/reuse a StringReader to reduce the number of GC calls?

  • Is this way of parsing scalable?

My current code looks like this:



public IColletion<object> RetrieveObjectsFromXml(
Stream stream,
XmlSchemaSet schemaSet,
params Type[] types)

var result = new List<object>();

// validations and other operations here...

using (var reader = XmlReader.Create(stream, readerSettings))

while (reader.Read())

if (reader.NodeType != XmlNodeType.Element)

continue;


// using HashSet, so this check will be O(1)
if (TagNameWillBeRetrieved(reader.SchemaInfo.SchemaElement.Name))

var data = reader.ReadOuterXml();

using (var stringReader = new StringReader(data))

// this method returns a XmlSerializer for a type
// which this tag belongs to.
var obj = GetXmlSerializerForTag(
reader.SchemaInfo.SchemaElement.Name)
.Deserialize(stringReader);

// this is just for brevity. I'll be yielding results here,
// yielding events or something else
// instead of returning a list of objects :)

result.Add(obj);




return result;









share







New contributor




cezarlamann is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$endgroup$


















    0












    $begingroup$


    I'm developing a generic XML Parser that would parse chunks of a given XML to a given list of types by using the "Pull parsing" approach, which I think is more "memory efficient/predictable", instead of loading unknown-sized XML files into memory.



    I'm caching the XmlSerializer objects for the given types and the last bit that I'm concerned is the following:



    The Deserialize method from XmlSerializer expects a Stream. To accomplish that, for each object that matches the criteria, I'm creating a new StringReader.



    My concern is: If I parse an arbitrarily big XML file, for each object that meets the criteria I'll be creating a new StringReader object. This is a "short-lived" object and for sure I'll get lots of GC calls to deal with dangling StringReader objects, which I guess that may be harmful, performance-wise.



    I have the following questions:



    • Is there a way to recycle/reuse a StringReader to reduce the number of GC calls?

    • Is this way of parsing scalable?

    My current code looks like this:



    public IColletion<object> RetrieveObjectsFromXml(
    Stream stream,
    XmlSchemaSet schemaSet,
    params Type[] types)

    var result = new List<object>();

    // validations and other operations here...

    using (var reader = XmlReader.Create(stream, readerSettings))

    while (reader.Read())

    if (reader.NodeType != XmlNodeType.Element)

    continue;


    // using HashSet, so this check will be O(1)
    if (TagNameWillBeRetrieved(reader.SchemaInfo.SchemaElement.Name))

    var data = reader.ReadOuterXml();

    using (var stringReader = new StringReader(data))

    // this method returns a XmlSerializer for a type
    // which this tag belongs to.
    var obj = GetXmlSerializerForTag(
    reader.SchemaInfo.SchemaElement.Name)
    .Deserialize(stringReader);

    // this is just for brevity. I'll be yielding results here,
    // yielding events or something else
    // instead of returning a list of objects :)

    result.Add(obj);




    return result;









    share







    New contributor




    cezarlamann is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.







    $endgroup$














      0












      0








      0





      $begingroup$


      I'm developing a generic XML Parser that would parse chunks of a given XML to a given list of types by using the "Pull parsing" approach, which I think is more "memory efficient/predictable", instead of loading unknown-sized XML files into memory.



      I'm caching the XmlSerializer objects for the given types and the last bit that I'm concerned is the following:



      The Deserialize method from XmlSerializer expects a Stream. To accomplish that, for each object that matches the criteria, I'm creating a new StringReader.



      My concern is: If I parse an arbitrarily big XML file, for each object that meets the criteria I'll be creating a new StringReader object. This is a "short-lived" object and for sure I'll get lots of GC calls to deal with dangling StringReader objects, which I guess that may be harmful, performance-wise.



      I have the following questions:



      • Is there a way to recycle/reuse a StringReader to reduce the number of GC calls?

      • Is this way of parsing scalable?

      My current code looks like this:



      public IColletion<object> RetrieveObjectsFromXml(
      Stream stream,
      XmlSchemaSet schemaSet,
      params Type[] types)

      var result = new List<object>();

      // validations and other operations here...

      using (var reader = XmlReader.Create(stream, readerSettings))

      while (reader.Read())

      if (reader.NodeType != XmlNodeType.Element)

      continue;


      // using HashSet, so this check will be O(1)
      if (TagNameWillBeRetrieved(reader.SchemaInfo.SchemaElement.Name))

      var data = reader.ReadOuterXml();

      using (var stringReader = new StringReader(data))

      // this method returns a XmlSerializer for a type
      // which this tag belongs to.
      var obj = GetXmlSerializerForTag(
      reader.SchemaInfo.SchemaElement.Name)
      .Deserialize(stringReader);

      // this is just for brevity. I'll be yielding results here,
      // yielding events or something else
      // instead of returning a list of objects :)

      result.Add(obj);




      return result;









      share







      New contributor




      cezarlamann is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.







      $endgroup$




      I'm developing a generic XML Parser that would parse chunks of a given XML to a given list of types by using the "Pull parsing" approach, which I think is more "memory efficient/predictable", instead of loading unknown-sized XML files into memory.



      I'm caching the XmlSerializer objects for the given types and the last bit that I'm concerned is the following:



      The Deserialize method from XmlSerializer expects a Stream. To accomplish that, for each object that matches the criteria, I'm creating a new StringReader.



      My concern is: If I parse an arbitrarily big XML file, for each object that meets the criteria I'll be creating a new StringReader object. This is a "short-lived" object and for sure I'll get lots of GC calls to deal with dangling StringReader objects, which I guess that may be harmful, performance-wise.



      I have the following questions:



      • Is there a way to recycle/reuse a StringReader to reduce the number of GC calls?

      • Is this way of parsing scalable?

      My current code looks like this:



      public IColletion<object> RetrieveObjectsFromXml(
      Stream stream,
      XmlSchemaSet schemaSet,
      params Type[] types)

      var result = new List<object>();

      // validations and other operations here...

      using (var reader = XmlReader.Create(stream, readerSettings))

      while (reader.Read())

      if (reader.NodeType != XmlNodeType.Element)

      continue;


      // using HashSet, so this check will be O(1)
      if (TagNameWillBeRetrieved(reader.SchemaInfo.SchemaElement.Name))

      var data = reader.ReadOuterXml();

      using (var stringReader = new StringReader(data))

      // this method returns a XmlSerializer for a type
      // which this tag belongs to.
      var obj = GetXmlSerializerForTag(
      reader.SchemaInfo.SchemaElement.Name)
      .Deserialize(stringReader);

      // this is just for brevity. I'll be yielding results here,
      // yielding events or something else
      // instead of returning a list of objects :)

      result.Add(obj);




      return result;







      c# memory-management xml





      share







      New contributor




      cezarlamann is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.










      share







      New contributor




      cezarlamann is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.








      share



      share






      New contributor




      cezarlamann is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 4 mins ago









      cezarlamanncezarlamann

      1011




      1011




      New contributor




      cezarlamann is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      cezarlamann is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      cezarlamann is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.




















          0






          active

          oldest

          votes












          Your Answer





          StackExchange.ifUsing("editor", function ()
          return StackExchange.using("mathjaxEditing", function ()
          StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
          StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
          );
          );
          , "mathjax-editing");

          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "196"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );






          cezarlamann is a new contributor. Be nice, and check out our Code of Conduct.









          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f217088%2fstringreader-reuse-for-xml-parsing-in-c%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          cezarlamann is a new contributor. Be nice, and check out our Code of Conduct.









          draft saved

          draft discarded


















          cezarlamann is a new contributor. Be nice, and check out our Code of Conduct.












          cezarlamann is a new contributor. Be nice, and check out our Code of Conduct.











          cezarlamann is a new contributor. Be nice, and check out our Code of Conduct.














          Thanks for contributing an answer to Code Review Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          Use MathJax to format equations. MathJax reference.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f217088%2fstringreader-reuse-for-xml-parsing-in-c%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          名間水力發電廠 目录 沿革 設施 鄰近設施 註釋 外部連結 导航菜单23°50′10″N 120°42′41″E / 23.83611°N 120.71139°E / 23.83611; 120.7113923°50′10″N 120°42′41″E / 23.83611°N 120.71139°E / 23.83611; 120.71139計畫概要原始内容臺灣第一座BOT 模式開發的水力發電廠-名間水力電廠名間水力發電廠 水利署首件BOT案原始内容《小檔案》名間電廠 首座BOT水力發電廠原始内容名間電廠BOT - 經濟部水利署中區水資源局

          格濟夫卡 參考資料 导航菜单51°3′40″N 34°2′21″E / 51.06111°N 34.03917°E / 51.06111; 34.03917ГезівкаПогода в селі 编辑或修订