iOS CoreData – ¿existen desventajas para la habilitación de sqlite WAL / Registro de Escritura Anticipada

En la WWDC 2013 sesión ‘207: ¿Qué hay de Nuevo en los Datos de los núcleos’, mencionan que puede habilitar SQLite WAL pasando por una de las opciones de diccionario cuando la adición de un almacén persistente:

@{ NSSQLitePragmasOption: @"journal_mode = WAL" }

(que está disponible en iOS4+ y será el predeterminado para las futuras versiones de iOS).

Me pregunto si esta suele ser una buena cosa para habilitar en mi app para anteriores versiones de iOS también.

He consultado la SQLite página acerca de escribir registro por adelantado y las desventajas que mencionar que la mayoría de ellos parece que no se aplican a iOS aparte de:

  • WAL podría ser un poco más lento (tal vez el 1% o 2% más lento) que el
    tradicional de la reversión de la revista enfoque en las aplicaciones que en su mayoría
    lee y rara vez escribir.

casi todas las ventajas de hacer sonar como probablemente sea un beneficio en iOS:

  • WAL es significativamente más rápido en la mayoría de los escenarios.
  • WAL proporciona más de concurrencia como lectores, no de bloque de los escritores y de un escritor de no bloquear los lectores. La lectura y la escritura pueden proceder simultáneamente.
  • Disco de operaciones de e/S tiende a ser más secuencial utilizando WAL.
  • WAL utiliza muchos menos fsync() de sus operaciones y, por tanto, menos vulnerables a los problemas en los sistemas donde la fsync() llamada al sistema que está roto.

Estoy con la asunción (tal vez sujeto a hacer algunas comprobaciones en mi app para asegurarse de que no ralentizar las cosas) de que esta sería una buena cosa para habilitar, pero ¿hay alguna desventaja que deben observar a los problemas conocidos?

InformationsquelleAutor JosephH | 2013-07-05

2 Kommentare

  1. 18

    http://pablin.org/2013/05/24/problems-with-core-data-migration-manager-and-journal-mode-wal/ sugiere que su pueden ser problemas con las migraciones, en particular:

    Cuando se utiliza un Administrador de Migración de Datos Básicos que va a crear una nueva base de datos
    para usted, y empezar a copiar las entidades uno por uno, desde el antiguo DB a
    el nuevo uno.

    Como estamos usando journal_mode = WAL, hay un archivo adicional además de
    DB.sqlite llamado DB.sqlite-wal.

    De lo que puedo decir, el problema parece ser que el Núcleo de Datos crea un
    temporal DB, inserciones de todo lo que hay, y cuando se cambia el nombre a la
    nombre original, el archivo wal se mantiene como un residuo de la vieja
    versión. El problema es que usted termina con una incoherente DB.

    (también mencionado en https://github.com/magicalpanda/MagicalRecord/issues/490 – lo que sugiere que si usted mágico de uso de registro, a continuación, es ya el impago de WAL )

    • Debo señalar que esto sólo sucede en el «avanzado» de las migraciones, cuando se necesita un Administrador de Migración. Menos radical de las migraciones (como la adición o el cambio de nombre de una columna) funciona muy bien, ya que se realizan en la misma base de datos y no en una copia.
    • No podía deshabilitar temporalmente WAL, la eliminación de la revista (-wal archivo) y, a continuación, hacer la migración …?
    • La migración de db, generalmente ocurre durante el inicio de una aplicación. No quiere esto decir que el punto de control ya debe de haber ejecutado durante la última aplicación de cerrar?
    • El problema es sólo durante una avanzada de la migración, donde coredata no cambiar el nombre de un archivo correctamente. La solución que se ha mencionado en los enlaces de blog, especificando journal_mode = BORRAR cuando la aplicación detecta una migración que tiene que suceder, evita que el archivo existente cuando la migración ocurre.
  2. 2

    Sobre el error que se produce con los no-ligero migraciones que implican la creación de subclases NSMigrationManager, que he re-informó a Apple como Error 16038419.

    También he hecho una diferente, método-swizzling solución que los parches el error en los casos donde se siempre desea utilizar legado borrar/deshacer el diario. Como yo lo entiendo, Pablin a arreglar es para los casos cuando se desea utilizar WAL excepto durante las migraciones. También, usted puede ver que los fallos se producen en este video.

    • Impresionante, gracias. De interés, en qué casos se desea evitar siempre WAL?
    • Caso 1: Mac OS X Core de Datos de la aplicación no utiliza el archivo de paquetes. El sqlite archivo es el archivo de documento. Los usuarios rasca la cabeza cuando ven -shm y archivos wal adyacentes a sus documentos en el Finder. Se puede pensar que estos son basura, y ya sea la basura de ellos, o ignorarlos cuando mover o copiar el archivo de documento. Resultado: la pérdida de datos. Caso 2: «WAL journal_mode no es, sin embargo, se recomienda para leer-sólo archivos de base de datos, o para los archivos que necesita para interactuar con el iOS 4 o anterior.» Que es de: developer.apple.com/library/ios/releasenotes/DataManagement/…

Kommentieren Sie den Artikel

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

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...