Cambiar la codificación a UTF-8 en un arroyo (MemoryMappedViewStream)

Estoy utilizando el código de abajo para leer un ~2.5 Gb archivo Xml tan rápido como puedo (gracias a MemoryMappedFile). Sin embargo, me estoy haciendo de la siguiente excepción: «‘.’, valor hexadecimal 0x00, es un carácter no válido. Línea 9778, posición 73249406.«. Yo piensan que se debe a algún problema de codificación. ¿Cómo puedo asegurarme de que el MemoryMappedViewStream lee el archivo con codificación UTF-8?

static void Main(string[] args)
{
    using (var file = MemoryMappedFile.CreateFromFile(@"d:\temp\temp.xml", FileMode.Open, "MyMemMapFile"))
    {
        using (MemoryMappedViewStream stream = file.CreateViewStream())
        {
            Read(stream);
        }
    }
}

static void Read(Stream stream)
{
    using (XmlReader reader = XmlReader.Create(stream))
    {
        reader.MoveToContent();

        while (reader.Read())
        {
        }
     }
 }
  • No, es porque se salió de la final de la asignación. Sólo se puede esperar para asignar el total de 2,5 gigabytes en un sistema operativo de 64 bits. Este código no lograr nada, en realidad se está haciendo más lento por la copia de los datos dos veces. Primero en la caché del sistema de archivos, de nuevo a la vista. Los archivos asignados en memoria sólo son útiles si usted lee los mismos datos de ellos en repetidas ocasiones. No.
InformationsquelleAutor Martin | 2011-08-19

2 Kommentare

  1. 3

    Usted podría utilizar la clase StreamReader para definir la codificación:

    static void Main(string[] args)
    {
      using (var file = MemoryMappedFile.CreateFromFile(@"d:\temp\temp.xml", FileMode.Open,  "MyMemMapFile"))
      {
         using (MemoryMappedViewStream stream = file.CreateViewStream())
        {
            Read(stream);
        }
       }
    }
    
    static void Read(Stream stream)
    {
      using (XmlReader reader = XmlReader.Create(new StreamReader(stream, Encoding.UTF8)))
      {
         reader.MoveToContent();
    
        while (reader.Read())
        {
        }
     }
    }

    Esperanza, que esta ayuda.

  2. 0

    Sobre MSDN se obtiene la siguiente.

    «XmlReader examina los primeros bytes de la secuencia buscando una marca de orden de bytes u otro signo de codificación»

    ¿Su archivo xml especificar una codificación?

    <?xml version="1.0" encoding="UTF-8"?>
    • Um, la pregunta era acerca de leer de la corriente, y esta respuesta es todo acerca de la redacción. Eso no es aplicable a la OP del problema. «Hacer una cosa similar» no computa cuando el código de ejemplo aquí es acerca de la codificación del texto en bytes antes de que llegue la corriente.
    • Makholm, cambió mi respuesta. Lo siento, pensé que podría ser el camino que estaba leyendo y la conversión de la corriente. Pero sólo vio a su ejemplo después.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea