Python: Unvorhersehbarer Speicherfehler beim Herunterladen großer Dateien

Ich schrieb ein Python-Skript, das ich verwende, um eine große Anzahl von Videodateien (jeweils 50-400 MB) von einem HTTP-Server herunterzuladen. Es hat gut gearbeitet, so weit auf lange Listen von Downloads, aber aus irgendeinem Grund hat es selten einen Speicherfehler.

Die Maschine hat ca. 1 GB RAM kostenlos, aber ich glaube nicht, dass es jemals auf RAM läuft, während dieses Skript ausgeführt wird.

Ich habe den Speicherverbrauch in der Task-Manager und perfmon überwacht und es verhält sich immer gleich von dem, was ich gesehen habe: langsam erhöht sich während des Downloads, dann kehrt nach normalem Level zurück, nachdem es den Download beendet hat (Es gibt keine kleinen Lecks, die kriechen Oder so ähnlich).

Die Art und Weise, wie sich der Download verhält, ist, dass es die Datei erstellt, die bei 0 KB bleibt, bis der Download beendet ist (oder das Programm abstürzt), dann schreibt sie die ganze Datei sofort und schließt sie.

for i in range(len(urls)): if os.path.exists(folderName + '/' + filenames[i] + '.mov'): print 'File exists, continuing.' continue # Request the download page req = urllib2.Request(urls[i], headers = headers) sock = urllib2.urlopen(req) responseHeaders = sock.headers body = sock.read() sock.close() # Search the page for the download URL tmp = body.find('/getfile/') downloadSuffix = body[tmp:body.find('"', tmp)] downloadUrl = domain + downloadSuffix req = urllib2.Request(downloadUrl, headers = headers) print '%s Downloading %s, file %i of %i' % (time.ctime(), filenames[i], i+1, len(urls)) f = urllib2.urlopen(req) # Open our local file for writing, 'b' for binary file mode video_file = open(foldername + '/' + filenames[i] + '.mov', 'wb') # Write the downloaded data to the local file video_file.write(f.read()) ##### MemoryError: out of memory ##### video_file.close() print '%s Download complete!' % (time.ctime()) # Free up memory, in hopes of preventing memory errors del f del video_file 

Hier ist die Stapelspur:

  File "downloadVideos.py", line 159, in <module> main() File "downloadVideos.py", line 136, in main video_file.write(f.read()) File "c:\python27\lib\socket.py", line 358, in read buf.write(data) MemoryError: out of memory 

One Solution collect form web for “Python: Unvorhersehbarer Speicherfehler beim Herunterladen großer Dateien”

Dein Problem ist hier: f.read() . Diese Zeile versucht, die gesamte Datei in den Speicher herunterzuladen. Stattdessen, lesen Sie in Chunks ( chunk = f.read(4096) ), und speichern Sie die Stücke in temporäre Datei.

Python ist die beste Programmiersprache der Welt.