2017-11-02 2 views
-1

Fehler:. self._content = Bytes() join (self.iter_content (CONTENT_CHUNK_SIZE)) oder Bytes() MemoryPython3.6 herunterladen 1.3G Big Videodatei erzeugen Memory

def download(self): 
    print("start thread:%s at %s" % (self.getName(), time.time())) 
    headers = {"Range": "bytes=%s-%s" % (self.startpos, self.endpos)} 
    res = requests.get(self.url, headers=headers, stream=True) 
    # res.text 是将get获取的byte类型数据自动编码,是str类型, res.content是原始的byte类型数据 
    # 所以下面是直接write(res.content) 

    with open(self.filename, "wb") as fp: 
     fp.seek(self.startpos) 
     fp.write(res.content) 
    print("stop thread:%s at %s" % (self.getName(), time.time())) 
    # f.close() 

def run(self): 
    self.download() 
+0

Danke für die Freigabe. FYI heute hasse ich einen Gurkensalat, es hatte nicht genug Sauce. [ask] – Julien

Antwort

1

Ich hatte das gleiche Problem auf Windows 10. Wenn Ihre Plattform nicht Windows NT oder neuer ist, wird diese Antwort nicht helfen.

Das Problem ist: Unter Windows ist der Socket-Eingang immer gepuffert. Dies kann NICHT vermieden werden. Auf keinen Fall. Und das verursacht MemoryError wegen Windows (nicht durch Python-Code) und Python C internals - Socket-Eingabe wird in eine C-Variable gepuffert, diese haben begrenzte Größe, also müssen wir diesen Puffer "helfen" - die Lösung ist: ein bytearray-Objekt erstellen und ruft seine Join-Methode (zweiter Parameter - sockobj.recv (1024)) in einer while-Schleife auf. Navigieren Sie hierzu zu <Python Installdir>\Lib\requests.py (kann auch Lib\site-packages\requests\__init__.py sein - beachten Sie TWO Unterstriche!) Und beheben Sie alle Socket-Verwendung mit dem oben angegebenen Fix. Führen Sie auch eine solche Korrektur für alle Dateien im Paket requests und auch urllib3 durch.

Hoffe, das hilft.

Nein. Python 64bit wird Ihr Problem NICHT beheben: Windows Socket Buffer bleibt DAS GLEICH! Nur geloopte recv mit expliziten Python bytearray Puffer wird helfen!

+0

Ja, verwenden Sie Python3.6 Version? Ich kann die __init__.py oder __init__.py nicht finden. Ich finde die requests.py in Python36-32 \ Lib \ site-packages \ requests \ __ init__.py. aber die Datei Inhalt nur 121 Zeilen, –

+0

Ich versuche, die python3.6 64-Version in Windows zu verwenden, ist es das Problem zu beheben.Thanks –

+0

@ pengfei.gao Nun ... Wenn meine Antwort Ihr Problem behoben haben ... Vielleicht ist es Zeit zu Akzeptiere es ... Mit diesem großen grünen Häkchen. –

0

Du bist mit stream=True, die explizit hat die Verwendung der Pufferung der Daten, so dass Sie den Puffer asynchron leeren können.

Das machst du nicht. Also einfach nicht stream=True verwenden sondern direkt in eine Datei speichern.

+0

Ich ändere den Code, nicht Stream = True, aber die MemoryError wieder generieren –