Im Moment versuche ich eine sehr große JSON-Objekt von einer API (besonders this eins), die abhängig von verschiedenen Faktoren kann mehr als ein paar MB sein. Das Problem ist jedoch, dass NodeJS für immer etwas braucht und dann nur noch nicht genug Speicher hat: Die erste Zeile meines Antwort-Callbacks wird nie ausgeführt.NodeJS http und extrem große Antwort Körper
Ich könnte jeden Artikel einzeln anfordern, aber das ist eine enorme Menge von Anfragen. Um den a-Entwickler hinter der neuen API zu zitieren:
Bis jetzt, wenn Sie alle Marktaufträge für Tranquility erhalten wollten, mussten Sie jeden Typ einzeln für jede Region anfordern. Das wären in der Regel 50+ Regionen multipliziert mit bis zu 13.000 Arten. Selbst wenn es nur 13.000 Typen und 50 Regionen waren, sind das 650.000 Anfragen, um alle Marktinformationen zu erhalten. Und wenn Sie alle Daten im 5-Minuten-Cache-Fenster abrufen wollten, würden Sie fast 2.200 Anfragen pro Sekunde benötigen.
Offensichtlich ist das keine gute Idee.
Ich versuche, das Array items
für später in redis zu bekommen, dann folgen Sie der next
URL und wiederholen, bis die letzte Seite erreicht ist. Gibt es eine Möglichkeit, dies zu tun?
EDIT: Hier ist der Problemcode. Der Besuch der URL funktioniert gut im Browser.
// ...
REGIONS.forEach((region) => {
LOG.info(' * Grabbing data for `' + region.name + '#' + region.id + '`');
var href = url + region.id + '/orders/all/', next = href;
var page = 1;
while (!!next) {
https.get(next, (res) => {
LOG.info(' * * Page ' + page++ + ' responded with ' + res.statusCode);
// ...
Die erste LOG.info
Linie ausführt, während der zweite nicht der Fall ist.
Wenn die Antwort nur ein paar MB ist, warum Sie nicht genügend Arbeitsspeicher ausgeführt werden? Ich denke, du würdest mit dieser Frage beginnen wollen. Ich habe gerade die JSON-Antwort gemessen und es ist 6,23 MB. – jfriend00
Die Dokumentation warnt die Seite kann "mehrere" MB Größe sein, was alles bedeuten könnte. In beiden Fällen gibt es immer noch ein Problem mit dem Arbeitsspeicher und der Ausführungszeit. Es dauert nicht lange, den Link in einem Browser einfach zu besuchen. – NukesForKids
Bitte zeigen Sie uns Ihren node.js Code. Es funktioniert sogar im Browser hier: https://jsfiddle.net/jfriend00/qscyqt7d/ – jfriend00