Утечка памяти с использованием pyobjc и Apple Vision VNRecounceeTextRequestPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Утечка памяти с использованием pyobjc и Apple Vision VNRecounceeTextRequest

Сообщение Anonymous »

Я использую библиотеку Apple Vision на Mac для извлечения текста из изображений PNG (около 10 000 изображений), используя несколько процессов с библиотекой многопроцессорной обработки на Python. Но я обнаружил, что память продолжает увеличиваться, пока не выйдет из-под контроля. Поэтому, чтобы упростить процесс и внимательно проверить память, я попробовал это с одним изображением 3000 раз, и произошло то же самое.
Я использую PyCharm на Apple M1.
Я Пробовал использовать NSAutoreleasePool, но результата пока нет.

Код: Выделить всё

import time
from Quartz import CIImage
from Vision import VNImageRequestHandler, VNRecognizeTextRequest
import multiprocessing
from Cocoa import NSURL, NSAutoreleasePool
import psutil
import os

def worker(job_queue):
process = psutil.Process(os.getpid())
while True:
# Create an autorelease pool to manage memory
pool = NSAutoreleasePool.alloc().init()

try:
t1 = time.time()
job = job_queue.get()
if job is None:  # Sentinel value to signal process to stop
print(f"Worker {multiprocessing.current_process().name} exiting.")
job_queue.task_done()
memory_info = process.memory_info().rss
print((multiprocessing.current_process().name, memory_info / 1024 / 1024))
break
print(f"Worker {multiprocessing.current_process().name} Job Number = {job[1]} url = {job[0]}")
url = NSURL.fileURLWithPath_(job[0])
ci_image = CIImage.imageWithContentsOfURL_(url)

request = VNRecognizeTextRequest.alloc().init()
handler = VNImageRequestHandler.alloc().initWithCIImage_options_(ci_image, None)
success, error = handler.performRequests_error_([request], None)
if error:
print(f"Worker {multiprocessing.current_process().name} result = {success}, error = {error}")

print(f"Worker {multiprocessing.current_process().name} done. Elapsed = {time.time() - t1}.")
request = None
handler = None
# Get memory usage of the current process
memory_info = process.memory_info().rss  # Resident Set Size in bytes

print((multiprocessing.current_process().name, memory_info / 1024 / 1024))

finally:
# Ensure the autorelease pool is drained to release memory
pool.drain()

job_queue.task_done()

memory_info = process.memory_info().rss
print((multiprocessing.current_process().name, memory_info / 1024 / 1024))

if __name__ == '__main__':
# Create a Queue for jobs
job_queue = multiprocessing.JoinableQueue()

# Number of worker processes
num_workers = 4

# Create worker processes
processes = []
for i in range(num_workers):
p = multiprocessing.Process(target=worker, args=(job_queue,result_queue), name=f"Worker-{i + 1}")
processes.append(p)
p.start()

# Put jobs into the queue
num_jobs = 3000
for job_id in range(num_jobs):
job_queue.put(["Path To File", job_id])

# Add sentinel values (None) to signal workers to stop after jobs are done
for _ in range(num_workers):
job_queue.put(None)

# Wait for all jobs in the queue to be processed
job_queue.join()

# Wait for all worker processes to finish
for p in processes:
p.join()

print("All jobs completed.")

Программа запускает 4 процесса и загружает в очередь 3000 заданий.
Каждый процесс берет задание из очереди, выполняет распознавание текста, затем отмечает его как выполненное и берет еще одно .
Я удалил часть, где он обрабатывает распознавание текста, потому что это не актуально, а память все равно увеличивается.
Потребление памяти на процесс начинается примерно с 250 МБ, а затем заканчивается примерно на 340 МБ.
Если я запустите это для большего количества файлов, у меня закончится память.
Как это исправить?

Подробнее здесь: https://stackoverflow.com/questions/790 ... extrequest
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»