将行附加到磁盘上的 shapefile(不在内存中)?

Append rows to shapefile on disk (not in memory)?

我正在尝试将 every block file from the 2010 census 组合成一个针对美国的主块文件。我目前正在 Google Colab 甚至他们的专业订阅中执行此操作 - 这为您提供了大约 25GB 的 RAM - 我正在最大化第 45 个文件上的所有可用内存(我还有 5 个要用!) .在代码方面,我只是构建了一个需要 concat 编辑在一起并最终写入磁盘的数据帧列表:

gdfs = []
census_blocks_basepath = r'/content/drive/My Drive/Census/blocks/'
census_block_filenames = [f for f in os.listdir(census_blocks_basepath) if f.endswith('.shp')]
for index, block_filename in enumerate(census_block_filenames):
  file_name = os.path.join(census_blocks_basepath, block_filename)
  gdfs.append(gpd.read_file(file_name))
  print('Appended file %s, %s' % (index, block_filename))

gdf = gpd.GeoDataFrame(pd.concat(gdfs, ignore_index=True), crs=dataframesList[0].crs)
# gdf.reset_index(inplace=True, drop=True)
gdf.head(3)

相反,我认为我应该:

  1. 加载单个地理数据框
  2. 将其附加到磁盘上存在的主数据帧(而不是像 csv.writer 那样存在于内存中)
  3. 1 中删除加载的地理数据框(以避免内存增加)
  4. 然后对源目录中剩余的所有地理数据帧重复 1-3

我没有看到关于 geopandas 是否支持基于磁盘的追加的文档。它似乎只能通过 GeoDataFrame.to_file. That said, I see that geopandas has a GeoDataFrame.to_postgis method with a chunksize argument 覆盖以前的文件,这让我认为可以将数据追加到磁盘上的地理文件中(或者我错了,那只是 postgis 的一个特性)。

有什么想法吗?

From MartinFleis

Yes, any file format which supports appending (and is supported by fiona) can be appended. You just have to specify mode="a".

df.to_file(filename, mode="a")

You can check if a mode is supported using

import fiona
fiona.supported_drivers

This is the current result r-read, a-append, w-write.

{'AeronavFAA': 'r',
 'ARCGEN': 'r',
 'BNA': 'raw',
 'DXF': 'raw',
 'CSV': 'raw',
 'OpenFileGDB': 'r',
 'ESRIJSON': 'r',
 'ESRI Shapefile': 'raw',
 'GeoJSON': 'rw',
 'GeoJSONSeq': 'rw',
 'GPKG': 'rw',
 'GML': 'raw',
 'GPX': 'raw',
 'GPSTrackMaker': 'raw',
 'Idrisi': 'r',
 'MapInfo File': 'raw',
 'DGN': 'raw',
 'PCIDSK': 'r',
 'S57': 'r',
 'SEGY': 'r',
 'SUA': 'r',
 'TopoJSON': 'r'}