es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Deserialización en lote de archivos json en C#.

Tengo 200.000 archivos json en el sistema de archivos.

Deserializarlos uno por uno y ponerlos en una Lista tarda alrededor de 4 minutos.

Busco la manera más rápida de deserializarlos o una forma de deserializarlos todos a la vez.

Ejemplo de código

El código que estoy usando es algo como esto:

var files = Directory.GetFiles(@"C:\Data","*.json");
var list = new List<ParsedData>();
var dt1 = DateTime.Now;
foreach(var file in files)
{
using (StreamReader filestr = File.OpenText(file))
{
JsonSerializer serializer = new JsonSerializer();
var data= (ParsedData)serializer.Deserialize(filestr, typeof(ParsedData));
list.Add(data);
}
}
var dt2 = DateTime.Now;

Console.WriteLine((dt2 – dt1).TotalMilliseconds);

Formato JSON

Y la muestra json es:

{

"channel_name": "@channel",
"message": "",
"text": "",
"date": "2015/10/09 12:22:48",
"views": "83810",
"forwards": "0",
"raw_text": "",
"keywords_marked": "",
"id": 973,
"media": "1.jpg"
}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Dado que deserializar 200.000 archivos JSON uno por uno tarda unos 4 minutos, se recomienda utilizar procesamiento por lotes para deserializarlos. Una posible solución es utilizar JsonConverter y leer todos los archivos en memoria usando StreamReader, luego deserializarlos todos a la vez utilizando el método JsonConvert.DeserializeObject.

    Aquí hay un ejemplo de código:

    var files = Directory.GetFiles(@"C:\Data", "*.json");
    var list = new List<parseddata>();
    
    using (var stream = new MemoryStream())
    using (var writer = new StreamWriter(stream))
    {
        foreach (var file in files)
        {
            using (var reader = new StreamReader(file))
            {
                writer.WriteLine(reader.ReadToEnd());
            }
        }
        writer.Flush();
    
        stream.Position = 0;
        using (var reader = new StreamReader(stream))
        {
            var json = reader.ReadToEnd();
            list = JsonConvert.DeserializeObject<><parseddata>>(json);
        }
    }
    
    Console.WriteLine(list.Count);
    

    En este código, todos los archivos JSON se leen en memoria utilizando StreamReader, luego se escriben en un MemoryStream. Luego, el MemoryStream se utiliza para deserializar todos los archivos JSON a la vez utilizando el método JsonConvert.DeserializeObject, que devuelve un objeto List. Finalmente, se imprime el recuento de elementos en la lista en la consola.

    Tenga en cuenta que este código asume que todos los archivos JSON tienen la misma estructura que el JSON de muestra proporcionado en la pregunta, y que la clase ParsedData ha sido definida correctamente con propiedades que coinciden con los campos JSON.

Comments are closed.