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

Проблема с памятью UIImage в CVPixelBuffer

У меня есть быстрая функция, которая принимает UIImage и возвращает CVPixelBuffer. При многократном запуске этой функции объем памяти продолжает увеличиваться, что приводит к сбою.

Что я уже понял:

  1. С помощью инструментов я изолировал проблему с памятью в строке кода image.draw. Он показывает много данных CGImage, хранящихся в памяти с течением времени.
  2. Я изолировал функцию, поэтому уверен, что проблема не в том, что происходит вне ее (в вызывающем), потому что я удалил оттуда весь код, а память продолжает расти.
  3. Я попытался отправить вызовы этому методу с некоторой задержкой, чтобы дать системе время на освобождение, но это не работает.
  4. Я попытался обернуть несколько частей кода в autoreleasepool, но все равно не работает.
  5. Я пробовал в основном потоке, в потоке утилиты.qos и т. Д., Ничего не меняется.
  6. Я прочитал все остальные вопросы в StackOverflow, но похоже, что решения других людей не работают в моем случае.

Это мой код. Любая помощь приветствуется, так как я действительно бьюсь головой об этом.

fileprivate func CreatePixelBufferFromImage(_ image: UIImage) -> CVPixelBuffer?{

    let size = image.size;

    var pxbuffer : CVPixelBuffer?

    let status = CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, self.exportingAdaptor!.pixelBufferPool!, &pxbuffer)

    guard (status == kCVReturnSuccess) else{
        return nil
    }

    CVPixelBufferLockBaseAddress(pxbuffer!, CVPixelBufferLockFlags(rawValue: 0));
    let pxdata = CVPixelBufferGetBaseAddress(pxbuffer!);

    let rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    let context = CGContext(data: pxdata, width: Int(size.width),
                            height: Int(size.height), bitsPerComponent: 8, bytesPerRow: CVPixelBufferGetBytesPerRow(pxbuffer!), space: rgbColorSpace,
                            bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue);

    context?.translateBy(x: 0, y: image.size.height);
    context?.scaleBy(x: 1.0, y: -1.0);

    UIGraphicsPushContext(context!)
    image.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height));
    //
    UIGraphicsPopContext()
    CVPixelBufferUnlockBaseAddress(pxbuffer!, CVPixelBufferLockFlags(rawValue: 0));

    return pxbuffer
}

  • Не могли бы вы опубликовать автономный код? Что такое например exportingAdaptor? 29.01.2020

Ответы:


1

Я обнаружил, что проблема была не в пиксельном буфере, а в ссылке на изображение.
Похоже (это просто мое мнение, основанное на поведении здесь), когда я рисую изображение в контексте, сохраняется много данных о пикселях изображения. в объекте image.cgimage. Поэтому я решил выпустить свою ссылку на изображение, которое я рисую после каждого вызова этой функции, и память оставалась стабильной на протяжении всего процесса.

28.05.2017

2

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

26.05.2017
  • Пробовал так: var buffer = self.CreatePixelBufferFromImage(image); buffer = nil; Это все еще не работает. Память увеличивается 26.05.2017
  • Новые материалы

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

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

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

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

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

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

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