使用 jq 处理巨大的 GEOJson 文件

2023-12-01

给定一个 GEOJson 文件如下:-

{
  "type": "FeatureCollection",
  "features": [
   {
     "type": "Feature",
     "properties": {
     "FEATCODE": 15014
  },
  "geometry": {
    "type": "Polygon",
    "coordinates": [
     .....

我想结束以下内容:-

{
  "type": "FeatureCollection",
  "features": [
   {
     "tippecanoe" : {"minzoom" : 13},
     "type": "Feature",
     "properties": {
     "FEATCODE": 15014
  },
  "geometry": {
    "type": "Polygon",
    "coordinates": [
     .....

IE。我已将 Tippecanoe 对象添加到数组中的每个功能中features

我可以通过以下方式完成这项工作:-

 jq '.features[].tippecanoe.minzoom = 13' <GEOJSON FILE> > <OUTPUT FILE>

这对于小文件来说很好。但是,处理 414Mb 的大文件似乎要花很长时间,因为处理器已达到极限并且没有任何内容写入输出文件

进一步阅读 jq 似乎--stream命令行参数可能会有所帮助,但我完全不知道如何使用它来达到我的目的。

我将不胜感激有一个示例命令行可以满足我的目的,并解释 --stream 正在做什么。


仅使用 jq 的一次性方法可能需要比可用内存更多的 RAM。如果是这种情况,那么下面显示了一个简单的全 jq 方法,以及基于使用 jq 和 awk 的更经济的方法。

除了将对象流重构为单个 JSON 文档之外,这两种方法是相同的。使用 awk 可以非常经济地完成此步骤。

在这两种情况下,假定具有所需形式的对象的大型 JSON 输入文件被命名为 input.json。

jq-only

jq -c  '.features[]' input.json |
    jq -c '.tippecanoe.minzoom = 13' |
    jq -c -s '{type: "FeatureCollection", features: .}'

jq 和 awk

jq -c '.features[]' input.json |
   jq -c '.tippecanoe.minzoom = 13' | awk '
     BEGIN {print "{\"type\": \"FeatureCollection\", \"features\": ["; }
     NR==1 { print; next }
           {print ","; print}
     END   {print "] }";}'

性能对比

为了进行比较,使用了 .features[] 中包含 10,000,000 个对象的输入文件。其大小约为1GB。

u+s:

jq-only:              15m 15s
jq-awk:                7m 40s
jq one-pass using map: 6m 53s
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 jq 处理巨大的 GEOJson 文件 的相关文章

随机推荐