将行附加到磁盘上的 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)
相反,我认为我应该:
- 加载单个地理数据框
- 将其附加到磁盘上存在的主数据帧(而不是像 csv.writer 那样存在于内存中)
- 从
1
中删除加载的地理数据框(以避免内存增加)
- 然后对源目录中剩余的所有地理数据帧重复
1
-3
我没有看到关于 geopandas 是否支持基于磁盘的追加的文档。它似乎只能通过 GeoDataFrame.to_file
. That said, I see that geopandas has a GeoDataFrame.to_postgis
method with a chunksize
argument 覆盖以前的文件,这让我认为可以将数据追加到磁盘上的地理文件中(或者我错了,那只是 postgis
的一个特性)。
有什么想法吗?
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'}
我正在尝试将 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)
相反,我认为我应该:
- 加载单个地理数据框
- 将其附加到磁盘上存在的主数据帧(而不是像 csv.writer 那样存在于内存中)
- 从
1
中删除加载的地理数据框(以避免内存增加) - 然后对源目录中剩余的所有地理数据帧重复
1
-3
我没有看到关于 geopandas 是否支持基于磁盘的追加的文档。它似乎只能通过 GeoDataFrame.to_file
. That said, I see that geopandas has a GeoDataFrame.to_postgis
method with a chunksize
argument 覆盖以前的文件,这让我认为可以将数据追加到磁盘上的地理文件中(或者我错了,那只是 postgis
的一个特性)。
有什么想法吗?
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'}