2017-06-13 1 views
0

Ich lade zwei 300MB MP3-Dateien in eine AudioBuffer und fahre fort, sie als WAV-Dateien zu kodieren. Irgendwann während des Kodierungsprozesses (der in einem Web-Worker passiert) stürzt der Browser wegen mangelndem Arbeitsspeicher ab.Wie kann man einen Crash-Speicher abfangen und damit umgehen?

Chrome crash

WAV-Dateien sind etwa 3 mal größer ist als MP3-Dateien, so wäre es ~ 1,8 GB zusätzlichen Speicherplatz benötigen die Umwandlung zu tun.

Die Dateien können eine beliebige Größe haben, da es sich um MP3-Dateien handelt, die der Benutzer zum Hochladen ausgewählt hat, sodass sie 10 MB oder 350 MB groß sein können. Dies bedeutet, dass der Speicher ausreichend sein kann oder nicht. Für den Fall, dass es nicht ausreicht, wie kann ich einfach den Fehler fangen und behandeln, anstatt den Browser abstürzen zu lassen?

Ich würde den Benutzer auf ein bestimmtes Projekt (alle Dateien kombiniert) Größe begrenzen, aber es scheint, dass die maximale Speichergrenze mit dem Betriebssystem, Betriebssystemarchitektur, Browserversion und Browser-Architektur variiert, die es fast unmöglich macht, ein solches Limit zu definieren .

Antwort

1

Leider gibt es keine Möglichkeit, einen "out-of-memory" -Fehler zu erfassen und zu behandeln, sorry. Aus Sicherheitsgründen stürzt V8 den Prozess immer ab, wenn er nicht genügend Arbeitsspeicher reservieren kann.

Das Speicherlimit für den JavaScript-Heap wird basierend auf der Größe des physischen Speichers des Computers dynamisch bestimmt. Bei "ausreichendem" RAM waren es bei 32-Bit-Desktop-Architekturen 700 MB und bei 64-Bit-Architekturen 1400 MB. In den letzten Versionen von Chrome/V8 wurde die Strategie jedoch optimiert, und die Obergrenze liegt jetzt bei 64 Bit bei 2048 MB. Ja, die Besonderheiten können sich im Laufe der Zeit ändern. Das Betriebssystem spielt jedoch keine Rolle (zumindest nicht für den JavaScript-Heap).

Ich bin nicht ganz sicher, ob AudioBuffer zählen zu V8 Heap-Limit (V8 selbst weiß nicht über AudioBuffers, sie sind durch den Einbetter, d. H. Blink implementiert).

Beachten Sie, dass Sie möglicherweise nicht jedes letzte Byte bis zu diesem Maximum verwenden können. Einige Speicher werden für interne Metadaten verwendet. und wenn Sie Arrays und Ähnliches dynamisch wachsen lassen, wachsen sie in Blöcken, was es wahrscheinlich macht, dass ein Wachstumsversuch das Limit erreicht, obwohl die Vorwachstumsgröße nicht "Maximum minus eins" war. Auf 32-Bit-Plattformen kann der Versuch, ein einzelnes großes Objekt zuzuweisen, auch aufgrund der Erschöpfung des Adressraums fehlschlagen: nachdem eine Anzahl von zufällig ausgewählten Seiten für diesen und jenen während der Lebensdauer des Prozesses zugewiesen wurde, kann es einfach nicht ausreichend sein großer zusammenhängender Adressraumblock, um ein großes Objekt mit mehreren hundert Megabyte zuzuweisen, auch wenn das Heap-Limit noch nicht erreicht ist.

Seitennotiz: "dreimal größer"? Für häufig verwendete MP3-Bitraten würde ich erwarten, dass WAV-Dateien bis zu 10 mal größer sind.

+0

Diese Antwort (https://stackoverflow.com/a/34667584/5086286) schlägt vor, dass die Betriebssystem- und Browser-Version eine Auswirkung auf das Speicherlimit haben, obwohl er über den gesamten Registerkarten-Speicher sprechen könnte, während Sie sprechen speziell über die Größe des JS-Heapspeichers. Ich denke, dass die 'AudioBuffer' im Heap des V8 enthalten sind, denn wenn ich einen" Heap-Snapshot "nehme, ist dieser enthalten. Was die WAV-Codierung angeht, konvertiere ich in eine 16-Bit-Datei, was erklären könnte, warum sie nur 3-4 mal so groß ist. Ich werde das JS-Heap-Limit testen und werde mich an Sie wenden. Vielen dank für Deine Hilfe! – maximedupre

+0

Ich habe derzeit eine Arbeitsseite, die eine JS-Heap-Größe von 1503MB hat (entsprechend einem Heap-Snapshot), was mich glauben lässt, dass 1400MB nicht das Limit ist. – maximedupre

+0

Huh, guter Punkt. Es stellte sich heraus, dass das Limit 1400 MB betrug, bis Chrome M56 und M57 es auf 2048 MB brachten. Ich werde meine Antwort aktualisieren. – jmrk

Verwandte Themen