Tengo varios archivos XML bastante grandes que representan datos exportados desde un sistema que debe ser utilizado por un proveedor de terceros. Estaba recortando los resultados en 2.500 registros para cada archivo XML porque los archivos se vuelven enormes e inmanejables de lo contrario. Sin embargo, el proveedor de terceros me ha pedido que combine todos estos archivos XML en un solo archivo. ¡Hay 78 de estos archivos XML y suman más de 700 MB de tamaño! Loco, lo sé ... entonces, ¿cómo harías para combinar estos archivos para acomodar al vendedor usando C#? Con suerte hay una manera eficaz real para hacer esto sin la lectura de todos los archivos a la vez utilizando LINQ :-)¿Cuál es la forma más eficiente en C# para unir más de 2 archivos xml con el mismo esquema?
Respuesta
Voy a salir en un miembro aquí y asumir que su xml se ve algo como:
<records>
<record>
<dataPoint1/>
<dataPoint2/>
</record>
</records>
Si ese es el caso, abriría una secuencia de archivos y escribiría la parte <records>
, luego abriría secuencialmente cada archivo XML y escribiría todas las líneas (excepto la primera y la última) en el disco. De esta manera, no tienes grandes cadenas en la memoria y todo debe ser muy, muy rápido para codificar y ejecutar.
public void ConsolidateFiles(List<String> files, string outputFile)
{
var output = new StreamWriter(File.Open(outputFile, FileMode.Create));
output.WriteLine("<records>");
foreach (var file in files)
{
var input = new StreamReader(File.Open(file, FileMode.Open));
string line;
while (!input.EndOfStream)
{
line = input.ReadLine();
if (!line.Contains("<records>") &&
!line.Contains("</records>"))
{
output.Write(line);
}
}
}
output.WriteLine("</records>");
}
Uso DataSet.ReadXml()
, DataSet.Merge()
, y DataSet.WriteXml()
. Deje que el marco haga el trabajo por usted.
Algo como esto:
public void Merge(List<string> xmlFiles, string outputFileName)
{
DataSet complete = new DataSet();
foreach (string xmlFile in xmlFiles)
{
XmlTextReader reader = new XmlTextReader(xmlFile);
DataSet current = new DataSet();
current.ReadXml(reader);
complete.Merge(current);
}
complete.WriteXml(outputFileName);
}
Para una descripción más detallada y ejemplos, echar un vistazo a this article de Microsoft.
Esta fue la ruta original que tomé. ¡El problema fue que el proceso terminó usando más de un gig de RAM! –
- 1. La forma más rápida y eficiente de crear XML
- 2. ¿Cuál es la forma más eficiente de ordenar un NSSet?
- 3. ¿Cuál es la forma más rápida/más eficiente de leer este XML en el diccionario (Linq u otra cosa?)
- 4. ¿Cuál es la forma más eficiente de crear ListBuffer vacío?
- 5. ¿Cuál es la forma más eficiente de ordenar las estructuras de C++ a C#?
- 6. Inicializando ... ¿cuál es más eficiente?
- 7. ¿Cuál es la forma más eficiente de hacer tabla de consulta en C#
- 8. ¿Cuál es la forma más eficiente de evitar operaciones duplicadas en una matriz de C#?
- 9. ¿Cuál es la forma más fácil de generar xml en C++?
- 10. ¿Cuál es el estilo de CSS más rápido/más eficiente
- 11. ¿Cuál es la expresión regular más eficiente?
- 12. ¿Qué esquema de etiqueta (s) es el más eficiente/efectivo?
- 13. ¿Cuál es la forma más eficiente de crear rutas en google maps desde archivos gps?
- 14. ¿La forma más eficiente de agregar matrices en C#?
- 15. ¿Cuál es la forma más rápida de combinar dos archivos xml en uno
- 16. ¿Cuál es la forma más eficiente de copiar de forma masiva a SQL Server desde Java?
- 17. ¿Cuál es la forma más rápida de grabar varios archivos?
- 18. ¿Cuál es la clase de recopilación más eficiente en C# para la búsqueda de cadenas
- 19. Cuál es la forma más eficiente de hacer operaciones bit a bit en una matriz C
- 20. ¿Cuál es la forma más eficiente de obtener el código fuente de la página web en C?
- 21. C#: ¿cuál es la forma más fácil de restar tiempo?
- 22. ¿Cuál es la forma más eficiente de hacer matrices de bytes inmutables en Scala?
- 23. ¿Cuál es la forma más eficiente de mover/cambiar el nombre de un nodo en NetworkX?
- 24. ¿Cuál es la forma más rápida de comprobar programáticamente la buena formación de los archivos XML en C#?
- 25. ¿Cuál es el analizador XML más rápido en PHP?
- 26. ¿Cómo 'unir' 2 o más DataTables en C#?
- 27. ¿La forma más eficiente de buscar en SQL?
- 28. ¿Cuál es la forma más eficiente de almacenar una matriz de enteros en una columna MySQL?
- 29. booleano [] vs. BitSet: ¿Cuál es más eficiente?
- 30. Java: XML en una base de datos, ¿cuál es la forma más simple?
Esta será la forma más rápida, pero es un poco 'hacky'. –
De acuerdo, 'hacky' en el mejor de los casos: p El DataSet.Merge parece mucho más elegante, pero no tengo idea de lo eficiente que sería la memoria. – JustLoren
Tengo el esquema horneado en cada archivo XML, por lo que esto sería aún más 'hacky' –