В моем приложении (приложение OS X) я отправляю около 5000 URL-запросов за короткий промежуток времени, чтобы получить объекты JSON с сервера. Я отправляю 50 запросов одновременно, дожидаюсь их завершения, а затем отправляю еще одну партию из 50. Но у меня возникают проблемы с управлением памятью ...NSURLSession - высокое использование памяти
К тому времени, когда все запросы завершены (~ 2 минут), мое приложение увеличило объем использования памяти примерно на 250 МБ, и эта память никогда не освобождается. Я использую NSURLSession/dataTaskWithURL
для извлечения данных, и для устранения неполадок я удалил ВСЕ код из обработчика завершения - он просто запускает запрос и отбрасывает ответ. Вот пример:
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()
}
Обратите внимание, что я отключить все кэш и куки, а также вызова invalidateAndCancel()
когда запрос завершен. Я также пробовал использовать стандарт sharedSession()
, но ничто из этого не имеет значения - использование памяти всегда быстро поднимается и постоянно остается навсегда.
Это большая проблема, потому что моему приложению необходимо периодически отправлять эти запросы, и память с каждым циклом поднимается выше, что в конечном итоге достигает нескольких ГБ ОЗУ. Следует также отметить, что моя программа замедляет сканирование, как только использование памяти достигло этой точки.
Кто-нибудь знает, почему NSURLSession
может содержать столько памяти? Профилирование с помощью инструментов не выявляет утечек памяти, поэтому я довольно сильно обеспокоен здесь. Любая помощь или предложения были бы весьма признательны.
Дополнительная информация о том, почему вам нужно 5000 сеансов? Похоже, вы работаете против iOS здесь, это безумное большое число? – Ben
@Ben Это приложение для Mac, а не приложение для iOS. В принципе, он работает 24/7 и выполняет анализ на огромные объемы данных. Это много запросов, но, естественно, у машины есть подключение к Интернету для его обработки. Я должен также упомянуть, что я пытался повторить использование сеансов, а не создавать новый для каждого запроса, но безрезультатно. – hundley