OSError: [Errno 12] Cannot allocate memory von python-subprocess.rufen
Ich habe gelesen, einige ähnliche Beiträge zu diesem Thema, aber keiner scheint mir helfen direkt. Wenn dies tatsächlich ist, eine doppelter Beitrag, bitte mich direkt zu dem thread mit der Lösung!
Spare ich ein paar Bilder und dann Aufruf von ffmpeg mit subprocess.nennen. Ich mache dies einige Male Sammlungen von verschiedenen Bildern. Dies ist im Grunde das, was ich Tue:
from subprocess import call
for video in videos:
call(['ffmpeg', ..., '-i', video, video+'.mp4')])
In der isolation einwandfrei ist. Allerdings, wenn ich auch eine andere Verarbeitung durchgeführt, bevor diese Anrufe (nicht innerhalb der Schleife, buchstäblich nur halten die Werte im Speicher, bevor die Schleife beginnt), stürzt es mit einem memory-Fehler, nachdem einige der videos (eigentlich während der letzten). Nach dieser Kommentar, Teilprozess.rufen forks/clones den aktuellen Prozess, das scheint zu bedeuten, dass es Anfragen ein memory allocation gleich, wie viel ich derzeit in Erinnerung haben, das scheint zu sein, Weg zu viel für das, was ich will zu tun, Aufruf von ffmpeg.
Wie kann ich den Aufruf von ffmpeg in python ohne zu Fragen reservieren, unnötige Mengen an Speicher?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während es wahr ist, dass der Teilprozess.Anruf Gabel Prozess, und dieses Kind Prozess hat seinen eigenen Speicherbereich, der zunächst identisch mit dem parent-Prozesses (dein python-Programm), moderne Betriebssysteme verwenden copy-on-write memory. Der Speicher-overhead von der Gabel Prozess ist zunächst relativ klein, nur erfordern ein paar KB Speicher im kernel für die Prozess-accounting. Es ist nicht, bis das Kind-Prozess gestartet, änderungen an seiner Erinnerung, die zusätzlichen Speicher erforderlich ist.
Nach der Verzweigung, wird der Kind-Prozess erzeugt, indem Teilprozess.Aufruf Aufruf einer der exec-Systemaufrufe, die Lasten ffmpeg in den Speicher und startet die Ausführung.
Außerdem, Gabel ist in der Regel der einzige Mechanismus, um erstellen Sie einen neuen Prozess auf einem POSIX-system (siehe hier), also ich glaube nicht, dass es eine alternative zu der Gabel-dann-exec-Sequenz, Teilprozess.call implementiert.
Können Sie versuchen Sie, Ihr Programm durch strace oder Valgrind, um zu sehen, genau das, was system call ist nicht immer die Speicher-Anforderungen. Dies kann Ihnen helfen, festzustellen, wie senken Sie Ihre Speicher-Anforderungen.
Ich hatte das gleiche Problem heute, und ich arbeitete nur umgehen, indem man os: