2016-09-27 3 views
0

Ich versuche, eine große GeoJSON-Datei in mein Programm zu laden, aber ich bin jetzt auf meinem dev-Server in einen "nicht genügend Arbeitsspeicher" Absturz (war kein Problem auf meinem tragbaren), mit dem Fehler:Nodejs und laden große GeoJSON-Datei, zum Durchsuchen?

Security context: 0x2a7393fcfb51 <JS Object> 
    1: parse [native json.js:62] [pc=0x25e952e638ef] (this=0x2a7393fc9111 <a JSON with map 0xb4bfd40a0e1>,C=0x3e8116304201 <Very long string[64906954]>,w=0x2a7393f04381 <undefined>) 
    2: arguments adaptor frame: 1->2 
    3: loadGeoJson [/home/myuser/myproject/node/geo-locations.js:26] [pc=0x25e952f451ff] (this=0x362211a62d19 <a GeoLocations with map 0x3e0b88b2b5b1>... 
FATAL ERROR: Committing semi space failed. Allocation failed - process out of memory 
1: node::Abort() [node] 
2: 0x10a08dc [node] 
3: v8::Utils::ReportApiFailure(char const*, char const*) [node] 
4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [node] 
5: v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node] 
6: v8::internal::Heap::CollectGarbage(v8::internal::GarbageCollector, char const*, char const*, v8::GCCallbackFlags) [node] 
7: v8::internal::Factory::NewFixedArray(int, v8::internal::PretenureFlag) [node] 
8: v8::internal::JsonParser<false>::ParseJsonArray() [node] 
9: v8::internal::JsonParser<false>::ParseJsonValue() [node] 
10: v8::internal::JsonParser<false>::ParseJsonArray() [node] 
11: v8::internal::JsonParser<false>::ParseJsonValue() [node] 
12: v8::internal::JsonParser<false>::ParseJsonArray() [node] 
13: v8::internal::JsonParser<false>::ParseJsonValue() [node] 
14: v8::internal::JsonParser<false>::ParseJsonObject() [node] 
15: v8::internal::JsonParser<false>::ParseJsonValue() [node] 
16: v8::internal::JsonParser<false>::ParseJsonObject() [node] 
17: v8::internal::JsonParser<false>::ParseJsonValue() [node] 
18: v8::internal::JsonParser<false>::ParseJsonArray() [node] 
19: v8::internal::JsonParser<false>::ParseJsonValue() [node] 
20: v8::internal::JsonParser<false>::ParseJsonObject() [node] 
21: v8::internal::JsonParser<false>::ParseJsonValue() [node] 
22: v8::internal::JsonParser<false>::ParseJson() [node] 
23: v8::internal::JsonParser<false>::Parse(v8::internal::Handle<v8::internal::String>) [node] 
24: v8::internal::Runtime_ParseJson(int, v8::internal::Object**, v8::internal::Isolate*) [node] 
25: 0x25e9525092a7 
Aborted (core dumped) 

der Code wird aufgerufen, die dieses Problem verursachen, wie folgt:

JSON.parse(fs.readFileSync(filepath,"utf-8")) 

ich in zwei, um die Linien zu brechen versucht, aber da ich, dass der Absturz nicht aufgetreten getan hat, macht es schwer, zu debuggen. In der Zwischenzeit möchte ich sehen, ob es besser ist, mit dem Versuch, eine GeoJSON-Datei zu laden, umzugehen, um die Einträge durchsehen zu können.

Im Wesentlichen lade ich eine GeoJSON-Datei und suche nach einem Punkt innerhalb eines Polygons. Ich habe darüber nachgedacht, dies einfach in MongoDB zu werfen, aber ich habe es mit Dateiinhalten zu tun, die semi-transient sind.

Hat jemand irgendwelche Vorschläge?

Antwort

0

Haben Sie versucht, die maximale Speichergrenze im Knoten zu erhöhen? Der Standardwert ist 512 MB. Sie könnten so etwas tun, um es auf 1024 mb (oder mehr, abhängig von der Größe Ihres geoJsons) zu erhöhen.

Knoten --max-old-Raum-size = 1024 script.js

Kommentar, wenn dies das Problem nicht beheben, da es andere Lösungen sind möglich.

+0

Es scheint die Arbeit zu tun, obwohl ich neugierig sein würde, welche anderen Lösungen Sie im Sinn hatten. –

+0

Nicht die gesamte Datei in den Speicher laden war die andere Option. Sie können einen Knoten-Stream verwenden, um Teile der Datei in den Speicher einzulesen. Dies ist jedoch möglicherweise nicht sinnvoll, je nachdem, wie Sie die geoJSON-Datei verwenden. – user2263572