【问题标题】:How to avoid TopoJSON memory errors如何避免 TopoJSON 内存错误
【发布时间】:2023-03-18 07:00:02
【问题描述】:

我正在尝试创建美国学区的 TopoJSON 文件。我的工作流程如下:

  1. 从人口普查局下载并解压缩单个 TIGER 形状文件(24 个 ESD,19 个 SSD,56 美元)
  2. 用ogr2​​ogr批量合并这99个文件
  3. 将合并的 shapefile 转换为 GeoJSON
  4. 将 GeoJSON 转换为 TopoJSON(理想情况下,我也会在此处将状态边界添加到文件中)

第 4 步是什么导致我出现问题,我正在使用以下批处理脚本:

call topojson ^
    -o SDs11_Topo.json ^
    -p NAME ^
    --simplify-proportion .1 ^
    --id-property GEOID ^
    -- ^
    ESDs11.json ^
    SSDs11.json ^
    USDs11.json
pause

但是我遇到了以下致命的内存错误:

FATAL ERROR: CALL_AND_RETRY_0 Allocation failed - process out of memory

这让我对如何继续感到有些不知所措,如果有人能就更好的工作流程或在转换为 topojson 时更好地管理内存的方法提出建议,我将不胜感激。谢谢。

【问题讨论】:

  • 输入的 GeoJSON 文件有多大?如果它们接近约 1GB,则必须使用 shapefile 输入而不是 GeoJSON,因为 shapefile 更紧凑并且可以流式传输。 (Node.js 的最大缓冲区大小为 1GB,这使得解析大于该大小的 JSON 文件变得困难。)您还可以使用 node --max-old-space-size=XXXX bin/topojson 增加可用内存量,其中 XXXX 是大量兆字节。跨度>
  • 谢谢,使用 shapefile 作为输入似乎已经解决了这个问题(json 文件是 365、39 和 18 MB 文件)不幸的是,我现在遇到了一个不同的错误:ReferenceError: distance is not defined,我将为此创建一个单独的问题
  • *.com/q/16364671/1332731的后续问题

标签: javascript d3.js gis topojson


【解决方案1】:

使用node --max_old_space_size=999 topojson.js ... 增加node.js 的可用内存。

如果您使用的是 node.js 二进制文件,则需要 64 位二进制文​​件。 32 位的限制为 1GB。 https://code.google.com/p/v8/issues/detail?id=847

【讨论】:

  • 谢谢,虽然我能够通过使用 shapefile 作为输入而不是 GeoJSON 文件来避免内存错误,但我会接受这个答案,因为它可能在其他资源密集型应用程序中更有用