Domanda

Sono attualmente l'esportazione di una tabella del database con i dati enorme (100000+ record) in un file XML utilizzando classe XmlTextWriter e sto scrivendo direttamente in un file su l'unità fisica.

_XmlTextWriterObject = new XmlTextWriter(_xmlFilePath, null);

Mentre il mio codice viene eseguito ok, la mia domanda è che è l'approccio migliore? Dovrei scrivere invece l'intero XML in flusso di memoria prima e poi scrivere il documento XML in file fisico dal flusso di memoria? E quali sono gli effetti sulla memoria / prestazioni in entrambi i casi?

Modifica

Mi dispiace che non poteva in realtà trasmettere ciò che intendevo say.Thanks Ash per aver ricordato. Io effettivamente essere usando XmlTextWriter ma ho voluto dire se passare una stringa di percorso file fisico al costruttore XmlTextWriter (o, come John ha suggerito, al metodo XmlTextWriter.Create()) o l'uso flusso basato su API. I miei sguardi di codice attuali come il seguente:

XmlWriter objXmlWriter = XmlTextWriter.Create(new BufferedStream(new FileStream(@"C:\test.xml", FileMode.Create, System.Security.AccessControl.FileSystemRights.Write, FileShare.None, 1024, FileOptions.SequentialScan)), new XmlWriterSettings { Encoding = Encoding.Unicode, Indent = true, CloseOutput = true });
using (objXmlWriter)
{
   //writing xml contents here
}
È stato utile?

Soluzione

Mentre il mio codice viene eseguito ok, la mia domanda è che è l'approccio migliore?

Come detto e l'aggiornamento, XmlWriter.Create va bene.

O devo scrivere l'intero XML in flusso di memoria prima e poi scrivere il documento XML in file fisico dal flusso di memoria?

Hai la memoria di scrivere l'intero file in memoria? Se si allora questo approccio sarà più veloce, altrimenti streaming utilizzando un FileStream, che si prenderà cura di esso per voi.

E quali sono gli effetti sulla memoria / prestazioni in entrambi i casi?

Leggere l'intero file XML in utilizzerà più memoria, e spike il processore per iniziare. Streaming disco userà più processori. Ma avrete bisogno di utilizzare un file enorme per questo ad essere evidente dato hardware anche del desktop ora. Se siete preoccupati per le dimensioni crescenti ancora di più in futuro, bastone alla tecnica FileStream a prova di futuro esso.

Altri suggerimenti

La regola generale è quella di utilizzare XmlWriter quando il bisogno di documento essere scritta e non ha lavorato con in memoria, e per l'uso XmlDocument (o il DOM) in cui si ha bisogno di lavorare con esso nella memoria.

Ricordate, però, implementa XmlWriter IDisposable, in modo da effettuare le seguenti operazioni:

using (XmlWriter _XmlTextWriterObject = XmlWriter.Create(_xmlFilePath))
{
   // Code to do the write here
}

Come John Saunders detto che è meglio usare XmlWriter.Create (). Questa è la raccomandazione della MSDN. Il metodo XmlWriter.Create () può anche prendere un oggetto XmlWriterSettings. Ci si può personalizzare il proprio comportamento un po '. Se non avete bisogno di convalida e di carattere controllo allora si può spegnerlo e ottenere un po 'più di velocità. Ad esempio

XmlWriterSettings settings = new XmlWriterSettings();
settings.CheckCharacters = false;
using (XmlWriter writer = XmlWriter.Create("path", settings))
{
    //writing code
    writer.Flush();
}

In caso contrario, penso che tutto sia a posto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top