Nano Hash - криптовалюты, майнинг, программирование

Предупреждение о памяти после загрузки и распаковки файлов с помощью ARC

Я загружаю с сервера несколько gzip-файлов xml, сохраняю их в папку документов и распаковываю каждый файл. После этого я удаляю файл .gz. Я делаю это в цикле для более или менее 500 файлов. Когда я использую инструменты, я вижу, что живые байты после этого процесса составляют более или менее 470 МБ. Когда я жду несколько секунд, ARC очищает его, и приложение переходит к 5 МБ живых байтов. Но поскольку это процесс синхронизации, мое приложение получает предупреждение о памяти сразу после этого, когда я не останавливаюсь после загрузки и распаковки. По крайней мере, я думаю, что должна быть возможность заставить ARC освободить память? Или у меня действительно плохой код, и я просто до сих пор этого не вижу?

Любая помощь или подсказка очень ценятся.

Скачивание и распаковка:

for(NSString *filePath in filePaths){
    NSString *localPath = [[DownloadManager sharedInstance] downloadFile:filePath];
    if(localPath){
        //downloaded correctly
        if([self unzipFileAtPath:localPath]){
            [FileUtility deleteFileAtPath:localPath];
        }
    }
}

Метод распаковки:

+ (BOOL)unzipFileAtPath:(NSString *)path
{
    NSData *gzData = [NSData dataWithContentsOfFile:path];
    NSData *ungzippedData = [gzData gunzippedData];

    BOOL success = [ungzippedData writeToFile:[FormatUtility pathWithoutGz:path] atomically:NO];
    ungzippedData = nil;
    gzData = nil;

    return success;
}

Ответы:


1

Оберните внутреннюю часть цикла for с помощью пул автоматического выпуска:

for (NSString* filePath in filePaths) {
    @autoreleasepool {
        // do work
    }
}

Проблема на самом деле не имеет ничего общего с ARC. Такие методы, как dataWithContentsOfFile:, вернут новый экземпляр объекта с автоматическим освобождением. Эти объекты не будут освобождены до тех пор, пока не будет опустошен окружающий пул автоматического освобождения, что по умолчанию происходит только в конце вашего потока/операции или когда вы возвращаетесь в цикл выполнения.

Когда вы выделяете много временных объектов в цикле, как вы делаете, вы должны использовать свой собственный пул автоматического освобождения, чтобы гарантировать, что эти временные объекты не накапливаются без необходимости.

09.11.2012
  • Я попробую это позже и дам вам обратную связь. Звучит хорошо, наверное, то, что я искал, спасибо! 09.11.2012
  • Это было решением! Большое спасибо. 12.11.2012
  • @ Даррен, это тоже решение для этого? stackoverflow.com/questions/19159932 / 04.10.2013

  • 2

    Я столкнулся с аналогичной проблемой при загрузке очень большого zip-файла (5 ГБ!), используя AFNetworking 2.6.4 и AFDownloadRequestOperation 2.0.1. Я считаю, что такая проблема с памятью вызвана фреймворком Flipboard FLEX 2.1.1. После того, как я закомментировал строку [[FLEXManager sharedManager] setNetworkDebuggingEnabled:YES];, она отлично работает.

    17.02.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..