Stack vs. Heap in Javascript? (Maximum call stack size exceeded)
Ich versuche zum Aufbau einer web-Seite, für die ich brauche die Schaufel um mehrere 100 MB Daten in JavaScript. Mit verschiedenen Browsern, die ich ausführen in "maximum call stack size exceeded" Fehler bei verschiedenen Datenmengen.
Kann ich dieses Problem beheben, indem Sie durch meinen code und versuchen, lokale Variablen innerhalb von Funktionen in einem globalen Rahmen zu versuchen, um Ihnen zugeteilt zu werden auf dem heap statt auf dem stack? Oder sind diese Konzepte nicht existieren in JavaScript? (Soweit ich weiß, habe ich keine großen rekursive Schleifen in meine Daten, also es ist wirklich ein paar riesige strings /Anzahl arrays, die anscheinend den Fehler verursacht)
Falls dies nicht möglich ist, gibt es Möglichkeiten zu Fragen, den browser zu reservieren mehr Speicher?
- +1 für den interessanten Beitrag
- Sie haben nicht verstanden, was Sie sehen. Was passiert ist, haben Sie eine rekursive Funktion, also eine Funktion, die nennt sich (oder ruft eine andere Funktion, die Anrufe der erste) wahrscheinlich durch Unfall.
- (Verwandte) stackoverflow.com/questions/6602864/...
- Wie genau Sie transportieren (Schaufeln 🙂 sagte, sind 100 MB Daten? Was server-side-Technologie verwenden Sie?
- Es könnte auch eine Funktion sein, die versucht, rekursiv Durchlaufen eines dieser sehr große Strukturen, die die OP erwähnt.
- Leider gibt es wirklich keine Rekursion in meinem code an der Stelle, wo es Probleme hat. Es muss eine variable allocation-problem.
- Ich bin mit einfachen XHR-Anfragen zum download der Daten aus Google AppEngine ist Blobstore. Manches ist auch direkt generierten client-Seite.
- Ohne deine code wird es immer ein Rätsel bleiben! Es gibt keine Möglichkeit, Sie zu beantworten. Alles Spekulation. Ohne den problematischen code, den Sie nicht habe eine Frage.
- absolut einig. Ich arbeite zu versuchen, die pin nach dem problem, so kann ich nach einigen code, der veranschaulicht, es.. Es nimmt mich eine Weile, da ich wirklich Codierung meiner Seite in GWT, also Java, das ist dann cross-kompiliert Massiv verschleierten JavaScript, ich kann also nicht einfach kopieren und fügen Sie den problem-Bereich...
- So wie können Sie also sehr sehr sicher, dass Sie don ' T haben keine Rekursion?
- Ich könnte mir vorstellen, dass es extrem schwer zu schreiben, ein cross-compiler, die eine Optimierung der nicht-rekursiven code durch Umwandlung in eine rekursive Implementierung...
- Gut, nun bin ich 150% sicher, es war nicht ein rekursions-Problem (siehe unten). Aber es ist ein bisschen von einem seltsamen Mechanismus, die zu diesem problem führen, also in 99,99% aller Fälle haben Sie wahrscheinlich Recht und es wäre eine Rekursion Problem, nur dieses mal nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine Trennung von Speicher in den stack/heap in Javascript. Was Sie sehen, könnte einer der folgenden:
OK, dachte das problem heraus. Es war wirklich keine Rekursion in meinem code. Es ist durchaus möglich, JavaScript-Funktionen aufrufen, die mit Hunderten von Argumenten, wenn Sie "varargs" - Funktionen wie zum Beispiel
<array>.splice(...)
, das war mein Täter.Beiseite: GWT implementiert die Java-Funktion
System.arraycopy(...)
mit der JavaScript-splice-Funktion in einer mehr oder weniger geschickte Art und Weise.splice akzeptiert eine beliebige Anzahl von Eingabe-Elemente zum einfügen in das Ziel-array. Es ist möglich, übergeben Sie diese Eingabe-Elemente aus einem anderen array mit dem folgenden Konstrukt:
Dies ist gleichbedeutend mit dem Aufruf:
Wenn Elemente groß wird (siehe unten für das, was "groß" bedeutet für verschiedene Browser), die Sie kann ein "Maximum call stack size exceeded" Fehler ohne Rekursion wie der Inhalt geladen wird, auf den stack für den Aufruf einer Funktion.
Hier eine kurze Skript, das veranschaulicht dieses Problem:
Verwenden Sie dieses Skript, von "big" sind die folgenden:
Und der Gewinner ist: Internet Explorer 8 für eine Veränderung! Es können alle system-Speicher, bevor dieser Funktionsaufruf fehlschlägt.
Randnotiz: Firefox und Opera tatsächlich werfen eine andere (weitere nützliche) Fehler-Meldung: Funktion.der Prototyp.Anwendung: argArray ist zu groß