Я использую 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.")
Каждый процесс берет задание из очереди, выполняет распознавание текста, затем отмечает его как выполненное и берет еще одно .
Я удалил часть, где он обрабатывает распознавание текста, потому что это не актуально, а память все равно увеличивается.
Потребление памяти на процесс начинается примерно с 250 МБ, а затем заканчивается примерно на 340 МБ.
Если я запустите это для большего количества файлов, у меня закончится память.
Как это исправить?
Подробнее здесь: https://stackoverflow.com/questions/790 ... extrequest