Nodejs并加载大型GeoJSON文件,用于搜索?

时间:2016-09-27 19:32:26

标签: node.js parsing geojson

我正在尝试将一个大的GeoJSON文件加载到我的程序中,但我现在正在遇到一个“内存不足”的问题。在我的开发服务器上崩溃(我的移动设备上没有问题),失败的原因是:

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)

导致此问题的被调用代码如下:

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

我试过打破两行中的行,但是因为我已经完成了崩溃没有发生,所以很难调试。与此同时,我想看看是否有更好的方法来处理尝试加载GeoJSON文件,以便能够查看条目?

基本上我正在做的是加载GeoJSON文件并搜索以查找Point是否在多边形内。我已经考虑过把它扔进MongoDB,但是我正在处理半瞬态的文件内容。

有人有任何建议吗?

1 个答案:

答案 0 :(得分:0)

您是否尝试增加节点中的最大内存限制?默认值为512 MB。您可以执行类似这样的操作,将其增加到1024 MB(或更多,具体取决于geoJson的大小)。

node --max-old-space-size = 1024 script.js

如果这不能解决问题,请注意,因为还有其他可行的解决方案。