NSURLSession – Alto uso de memory

En mi aplicación (una aplicación OS X), envío aproximadamente 5,000 requestes de URL en un corto período de time, para recuperar objects JSON de un server. Envío 50 requestes simultáneamente, espero que todas terminen y luego envío otro lote de 50. Pero tengo algunos problemas de administración de memory

Para cuando todas las requestes se hayan completado (~ 2 minutos), mi aplicación ha aumentado su uso de memory en unos 250 MB, y esta memory nunca se libera. Estoy usando NSURLSession/dataTaskWithURL para get los datos, y para resolver problemas he eliminado TODO el código del controller de finalización: simplemente dispara la request y descarta la respuesta. He aquí un ejemplo:

 func fetchData() { let config = NSURLSessionConfiguration.ephemeralSessionConfiguration() // Also tried .defaultSessionConfiguration() config.URLCache = nil config.HTTPCookieAcceptPolicy = .Never config.HTTPCookieStorage = nil let session = NSURLSession(configuration: config) let query = session.dataTaskWithURL(myURL) { (data, response, error) -> Void in session.invalidateAndCancel() // Normally call a completion handler here too } query.resume() } 

Tenga en count que estoy deshabilitando todo el caching y las cookies, así como invitando a invalidateAndCancel() cuando la request haya finalizado. También he intentado usar el shanetworkingSession() estándar, pero nada de esto hace ninguna diferencia: el uso de la memory siempre sube rápidamente y se mantiene alto de manera permanente.

Este es un gran problema, porque mi aplicación necesita enviar estas requestes periódicamente y la memory solo sube más alto con cada ciclo, llegando finalmente a varios GB de RAM. También debe notarse que mi progtwig se ralentiza al rastreo una vez que el uso de la memory ha llegado a este punto.

¿Alguien sabe por qué NSURLSession podría retener tanta memory? Perfilar con instrumentos no revela pérdidas de memory, así que estoy bastante confundido aquí. Cualquier ayuda o sugerencia sería muy apreciada.

Dos cosas:

  1. Dado que está utilizando NSURLSession , asegúrese de no crear una nueva para cada una de esas 5000 requestes. Instalé una y luego reutilizo eso. Quizás trate de usar NSURLSession.shanetworkingSession() lugar.

    He visto un modesto consumo de memory por session, y si tiene un número extraordinario de sesiones, puede sumr

  2. Dices que ejecutaste Instruments para search fugas. Hoy en día, rara vez encontrarás algo tan atroz como eso. Pero también debe search ciclos de reference fuertes y similares, como al analizar asignaciones o generaciones entre dos puntos en el time e identificar lo que representa los 250 MB, luego ver dónde está asignado, etc.

    Consulte los videos de WWDC, como Problemas de memory de fijación de 2013 o Rendimiento de la aplicación iOS de 2012 : Memoria (e ignore el hecho de que iOS está en el título, ya que muchos de estos principios se aplican igualmente en MacOS), lo que ilustrará cómo diagnosticar dichos problemas.

¿Has probado la configuration?

 Config = nil Query = nil Session = nil [session finishTasksAndInvalidate] 

Al final Pero, personalmente, me preocuparía más por qué necesitas hacer 5000 requestes. Me parece un mal layout …