将行追加到磁盘上的shapefile中不在内存中?

问题描述

我正在尝试将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覆盖以前的文件。就是说,我看到geopandas有一个chunksize argumentGeoDataFrame.to_postgis方法,这使我认为可以将数据附加到磁盘上的地理文件中(或者我错了,这只是postgis

有什么想法吗?

解决方法

From MartinFleis

是的,可以添加任何支持附加的文件格式(并由fiona支持)。您只需指定mode =“ a”。

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

您可以使用以下方式检查是否支持该模式

import fiona
fiona.supported_drivers

这是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'}