Tengo una gran matriz JSON que necesito guardar en Realm, el problema es que esta operación dura alrededor de 45 segundos y eso es demasiado. Intenté ejecutar la operación de guardar simultáneamente para cada elemento en la matriz JSON de esta manera:
for element in jsonArray { // jsonArray has about 25 elements DispatchQueue.global(qos: .userInitiated).async { let realm = try! Realm() let savedObject = realm.objects(MyObject.self).filter("name == '\(element.name)'") for subElement in element { // element is an array that has around 1000 elements let myModel = MyModel(initWith: subElement) // MyModel initialization is a simple light weight process that copies values from one model to another savedObject.models.append(myModel) } } } Cuando trato de ejecutar el mismo código pero con DispatchQueue.main.async , terminó alrededor de 2 veces más rápido, aunque no es concurrente. También intenté ejecutar el código anterior con calidad de servicio .userInteractive pero tiene la misma velocidad.
Cuando ejecuto este código, la utilización de la CPU es de aproximadamente el 30% y la memoria de aproximadamente 45 MB. ¿Es posible acelerar esta operación o llegué a un callejón sin salida?
DispatchQueue.global(qos: .userInitiated).async .Como se documenta en el sitio web de Realm :
Las operaciones de escritura de dominio son síncronas y de bloqueo, no asíncronas. Si el subproceso A inicia una operación de escritura, entonces el subproceso B inicia una operación de escritura en el mismo Reino antes de que finalice el subproceso A, el subproceso A debe finalizar y confirmar su transacción antes de que tenga lugar la operación de escritura del subproceso B. Las operaciones de escritura siempre se actualizan automáticamente en beginWrite(), por lo que las escrituras superpuestas no crean ninguna condición de carrera.
Esto significa que no obtendrá ningún beneficio al intentar escribir en varios hilos.