none
Estouro de memória com XML "muito grande"... RRS feed

  • Pergunta

  •  Estou com o seguinte problema.

     

    Tenho uma aplicação que carrega um XML para uma Stored Procedure no SQL Server 2000, lá dentro a SP desmembra esse XML e utiliza os dados dele onde se deve utilizar...

    Quando Carrego Arquivos XML pequenos, cerca de 500Kb funciona normalmente, porém quando tenho um XML "muito grande" da um erro de estouro de memória, cerca de 700 a 800 KB, o que ainda é muito pequeno...

     

    Sendo que a tendencia é que esse arquivo XML fique bem maior, cerca de 10MB. Alguém saberia como resolver esse problema ?

     

    vou passar meu código abaixo até a chamada da procedure...

     

     


    FORM:

     

    Code Snippet

     <script language="jscript">


      var oXML  = new ActiveXObject("MSXML2.DomDocument");
      var oHTTP = new ActiveXObject("MSXML2.XMLHTTP");

     

      function atualizaReadyState(){
        if (oHTTP.readyState==4)
         {
         alert(oHTTP.responseText)
         }

      }
       

      function doUpload(){

        
        oXML.load(document.all("xml").value);
        
        oHTTP.open("POST", "/Carga.asp", true);
        oHTTP.send(oXML);
        oHTTP.onreadystatechange=atualizaReadyState;
        
       
      }

     

     </script>
    </head>

    <body  marginwidth=0 marginheight=0 style="padding: 0px" >

     
     <form name="frm" method="Post" >
     <table width="100%" height="100%" cellspacing="0" cellpadding="0">
      <tr>
       <td align="center" valign="middle">
        <div style="width: 25%">
         <table border=1 cellspacing="0" >
          <tr>
           <td>Selecione arquivo:
           </td>
          </tr>

          <tr>
           <td><input type="file" name="xml" id="xml" style="width: 100%"/>
           </td>
          </tr>

          <tr>
           <td align="right"><input type="button" name="btnSubmit" onClick="doUpload()" value="enviar"/>
           </td>
          </tr>
         </table>
        </div>
       </td>
      </tr>
     </table>
     </form>

     </body>

     

     


     

    Carga

    Code Snippet

    <%


     Server.ScriptTimeout=600

     Response.CharSet="iso-8859-1"
     Response.Buffer=true

     

     DIM oXML   : SET oXML  = Server.CreateObject("MSXML2.DOMDocument")


     Dim strXML
     Dim lObj
     Dim lObjSize
     Dim lObjOffset  :lObjOffset =0
     Dim lObjChunk
     Dim lObjChunkSize :lObjChunkSize= 4000

     

     Dim oConn   : Set oConn = Server.CreateObject("ADODB.Connection")
     Dim oComm   : Set oComm = Server.CreateObject("ADODB.Command")
     Dim oRSet   : Set oRSet = Server.CreateObject("ADODB.RecordSet")

     

      oXML.load Request

      strXML = "<?xml version=""1.0"" encoding=""ISO-8859-1""?>"&oXML.xml

     

      with (oComm)

       .ActiveConnection= oConn
       .CommandType  = adCMDStoredProc
       .CommandText  = "SP_CARGA"
       .commandTimeout  = 600
      
       .Parameters.refresh
      
       lObj = strXML
       lngOffset = 0

       lObjSize = len(lObj)


       Do While lObjOffset < lObjSize
        lObjChunk = Left(Right(lObj, lObjSize - lObjOffset), lObjChunkSize)
        .Parameters("@XML").AppendChunk lObjChunk
        lObjOffset = lObjOffset + lObjChunkSize
       Loop

     

       .execute


      end with


    %>

     


     

    Se alguém puder dar uma ajuda.

     

    vlw
     

    terça-feira, 29 de janeiro de 2008 13:38

Todas as Respostas

  • Analisando, debugando cheguei a conclusão que a aplicação consegue pegar o XML que é passado, porém quando esse arquivo é muito grande ele não vem completo, não traz tds os nós, com isso gera um erro dentro da procedure...

     

    mas tow achando que o XML não esta chegando inteiro, pois deve existir um limite de caracteres que podem ser passados pelo metodo POST... Sendo que estou utilizando ajax (com POST) pra passar esse XML para pagina...

     

    acredito q por isso da o erro em relação a memória...

     

    agora a questão é a seguinte... como posso passar tantos dados via POST, por Ajax ?

    quarta-feira, 30 de janeiro de 2008 16:48
  • Pesquisando acabei achando essa informação bastante util...

     

    http://log4dev.com/2006/04/04/envio-de-grandes-conjuntos-de-dados-com-ajax/

     

    ae alterei meu codigo q ficou assim na chamada do ajax...

     

     

     

    Code Snippet

      function doUpload(){
        oXML.load(document.all("xml").value);

        oHTTP.open("POST","/Carga.asp", true);

        oHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

        if (oXML != null){
         oHTTP.setRequestHeader("Content-length", oXML.xml.length);
        }

        oHTTP.send(oXML);
        oHTTP.onreadystatechange=atualizaReadyState;

      }

     

     


     

    mas mesmo assim ainda não foi...
    quarta-feira, 30 de janeiro de 2008 18:03