2017-03-23 1 views
1

Ich habe eine ziemlich große JSON-Datei mit mehreren Millionen Geojson-Punkten. Ich kann es mit JSONParser problemlos einlesen. Ich versuche dann die Datei mit geojson-vt zu verarbeiten.Wie node.js Speichereinstellungen ändern, um sehr großen (> 100gb) Speicher zu ermöglichen

Für die Testdatei, die ich verwendet, das war 700mb das funktionierte gut, wenn ich den Parameter --max_old_space_size v8 auf 8GB oder so eingestellt. Jetzt versuche ich, mit einer vollen Datei von 3 GB für einen einzelnen Zustand zu arbeiten und Probleme zu lösen. Es scheint egal, wie hoch ich den Parameter max_old_space_size gesetzt habe, es wird nur etwa 34 GB verwenden, bevor der Garbage Collector es bei einem Zuteilungsfehler zum Absturz bringt, obwohl ich max_old_space_size auf 50 GB gesetzt habe.

Ich habe über einige andere v8 Parameter gelesen, die möglicherweise verwendet werden könnten. Hier ist der letzte Befehl, den ich ausführen wollte:

node --max_executable_size=5000 --max_old_space_size=54000 --max-semi-space-size=5000 -nouse-idle-notification --noconcurrent_sweeping app.js 

Hier ist der Fehler von diesem Befehl.

<--- Last few GCs ---> 

[27445:0x2e900d0] 587348 ms: Scavenge 29492.1 (31038.4) -> 29422.8 (31521.9) MB, 2092.6/0.0 ms allocation failure 
[27445:0x2e900d0] 591039 ms: Scavenge 30244.6 (31803.4) -> 30175.9 (32273.4) MB, 2070.4/0.0 ms allocation failure 
[27445:0x2e900d0] 594706 ms: Scavenge 30972.9 (32544.4) -> 30904.8 (33028.4) MB, 2060.4/0.0 ms allocation failure 
[27445:0x2e900d0] 620992 ms: Scavenge 31727.0 (33311.4) -> 31656.7 (2783311.9) MB, 24589.5/0.0 ms allocation failure 


<--- JS stacktrace ---> 
Cannot get stack trace in GC. 
FATAL ERROR: NewSpace::Rebalance Allocation failed - process out of memory 
1: node::Abort() [node] 
2: 0x12299bc [node] 
3: v8::Utils::ReportOOMFailure(char const*, bool) [node] 
4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [node] 
5: 0xa6b34b [node] 
6: v8::internal::MarkCompactCollector::EvacuateNewSpaceAndCandidates() [node] 
7: v8::internal::MarkCompactCollector::CollectGarbage() [node] 
8: v8::internal::Heap::MarkCompact() [node] 
9: v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node] 
10: v8::internal::Heap::CollectGarbage(v8::internal::GarbageCollector, v8::internal::GarbageCollectionReason, char const*, v8::GCCallbackFlags) [node] 
11: v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [node] 
12: v8::internal::Runtime_AllocateInTargetSpace(int, v8::internal::Object**, v8::internal::Isolate*) [node] 
13: 0x1a296258ed46 
Aborted 

Es scheint wie egal, was es nicht über diese Grenze hinaus wachsen wird. Gibt es andere Parameter, die ich einstellen kann, damit es mehr und GC weniger wachsen lässt?

Ich weiß, dies ist nicht der typische Anwendungsfall für node.js und es ist wahrscheinlich nicht das beste Werkzeug für den Job, aber wenn ich geojson-vt zum Arbeiten bekommen kann, gibt es einige andere Bibliotheken, die diese Daten verarbeiten können viel einfacher, also würde ich gerne diese Route gehen, wenn es möglich ist.

Ich habe grundsätzlich unbegrenzten Speicher, der für diese Aufgabe verwendet werden kann; bis zu ein paar TBs, also wird das kein limitierender Faktor sein. Dieses Dataset, das ich verwende, ist eigentlich ein sehr kleiner Teil eines größeren, der verarbeitet werden muss, so dass ich über das hinausgehen muss, wo ich jetzt bin.

Umwelt Details:

  • Node.js ist Version 7
  • Laufen auf CentOS 7
+0

Können Sie große Datei in passende Stücke aufteilen und gepufferten Prozess? Können Sie Stream-Parsing machen? Wahrscheinlich könnte Ihnen so etwas helfen https://www.npmjs.com/package/JSONStream – gabba

+0

Leider ist der Abschnitt, an dem ich arbeite, davon abhängig, dass alle Daten auf einmal verfügbar sind. Es versucht, Kacheln basierend auf den Punkten zusammenzufassen. Ich bin dabei, die Bibliothek zu modifizieren, um zu sehen, ob es dort etwas zu gewinnen gibt, aber vorerst sieht es so aus, als wäre ich etwas festgefahren. Das Aufteilen ist eine Option als letztes Mittel, macht es aber viel schwieriger, wenn ich die verdichteten Kacheln für Web-Clients bereitstellen muss. – Burke9077

+0

Wenn Ihr Algorithmus gepuffert werden kann, sollten Sie den Stream-Ansatz versuchen – gabba

Antwort

1

Zwei Ideen:

  • Versuchen nur --max_old_space_size Einstellung, keine anderen Flaggen . (Der spezifische Fehler, den Sie sehen, hat mit dem Zeitbereich zu tun; ich bin nicht überrascht, dass ein halber Speicherplatz von mehreren Gigabyte Probleme verursacht, da es keinen Grund gibt, so groß zu machen.)

  • Versuchen Sie es mit einem neuere Node.js-Version (entweder 8.x oder sogar die vee-eight-lkgr-Verzweigung auf https://github.com/v8/node für den neuesten Stand der Entwicklung). Es gab einige kürzlich behobene Probleme, um Super-Size-Heaps besser zu unterstützen.

+0

Um genauer zu sein: V8 5.8 führt offizielle Unterstützung für beliebig große Heaps ein, siehe: https://v8project.blogspot.com/2017/02/one-small-step-for-chrome-one-giant.html. Also Knoten 7.x ist einfach zu alt (es hat V8 5.5 drin). – jmrk

Verwandte Themen