简化大数据的Python代码


34

我有Python代码,旨在通过以下工作流程获取点shapefile:

  1. 合并点
  2. 积分点,使彼此之间1 m之内的任何点成为一个点
  3. 创建要素图层,在其中选择z <10的点
  4. 缓冲点
  5. 多边形到栅格的1m分辨率
  6. 重新分类,其中1-9 = 1;NoData = 0

每个shapefile大约有250,000至350,000个点,覆盖〜5x7 km。用作输入的点数据表示树的位置。每个点(即树)都有一个关联的“ z”值,该值代表冠半径,并在缓冲过程中使用。我的目的是在单独的过程中使用最终的二进制输出来生成描述遮篷的栅格。

我对四个shapefile进行了测试,生成了700MB的栅格,耗时35分钟(i5处理器和8GB RAM)。鉴于我将需要在3500个shapefile上运行此过程,因此,我希望获得有关简化该过程的任何建议(请参阅随附的代码)。一般来说,处理地理数据的最佳方法是什么?更具体地说,对代码或工作流程是否有任何有助于提高效率的调整?

编辑

地理处理任务的时间(占总数的百分比):

  • 合并= 7.6%
  • 积分= 7.1%
  • Lyr = 0的特征
  • 缓冲= 8.8%
  • 多边形转栅格= 74.8%
  • 重新分类= 1.6%

在此处输入图片说明

# Import arcpy module
import arcpy

# Check out any necessary licenses
arcpy.CheckOutExtension("spatial")

# Script arguments
temp4 = arcpy.GetParameterAsText(0)
if temp4 == '#' or not temp4:
    temp4 = "C:\\gdrive\\temp\\temp4" # provide a default value if unspecified

Reclassification = arcpy.GetParameterAsText(1)
if Reclassification == '#' or not Reclassification:
    Reclassification = "1 9 1;NODATA 0" # provide a default value if unspecified

Multiple_Value = arcpy.GetParameterAsText(2)
if Multiple_Value == '#' or not Multiple_Value:
    Multiple_Value = "C:\\t1.shp;C:\\t2.shp;C:\\t3.shp;C:\\t4.shp" # provide a default value if unspecified

# Local variables:
temp_shp = Multiple_Value
Output_Features = temp_shp
temp2_Layer = Output_Features
temp_Buffer = temp2_Layer
temp3 = temp_Buffer

# Process: Merge
arcpy.Merge_management(Multiple_Value, temp_shp, "x \"x\" true true false 19 Double 0 0 ,First,#,C:\\#########omitted to save space

# Process: Integrate
arcpy.Integrate_management("C:\\gdrive\\temp\\temp.shp #", "1 Meters")

# Process: Make Feature Layer
arcpy.MakeFeatureLayer_management(temp_shp, temp2_Layer, "z <10", "", "x x VISIBLE NONE;y y VISIBLE NONE;z z VISIBLE NONE;Buffer Buffer VISIBLE NONE")

# Process: Buffer
arcpy.Buffer_analysis(temp2_Layer, temp_Buffer, "z", "FULL", "ROUND", "NONE", "")

# Process: Polygon to Raster
arcpy.PolygonToRaster_conversion(temp_Buffer, "BUFF_DIST", temp3, "CELL_CENTER", "NONE", "1")

# Process: Reclassify
arcpy.gp.Reclassify_sa(temp3, "Value", Reclassification, temp4, "DATA")

3
可能需要输入一些性能计时代码来确定大部分时间是进入一个步骤还是几个步骤-以便可以专注于这些步骤以尝试发现性能提升
PolyGeo

5
如果您继续使用ArcPy,我认为您没有太多选择可以提高性能。也许您可以看看其他工具来做到这一点?FME之类的工具,或者可能是postgis?
tmske 2012年

3
目前尚不清楚使用的是哪种像素类型,但是如果它是“字节”(应该是),那么每个栅格的原始数据存储将为5000x7000 = 35Mb(〜33.4MB),实际上并不是那么大。但是,下一个维度3500(时间维度?)会将原始总大小增加到〜114GB。
Mike T

5
尽管无法从此描述中看出算法在做什么(或打算做什么),但是在大多数情况下,点缓存和栅格化之后应替换为点栅格化和焦点统计(通常是平均值或总和)。其结果将是相同的,但是,通过避免冗长的缓冲和聚光栅化步骤,将得到的快。我(强烈地)怀疑可以获得较大的额外加速,但是由于程序描述的含糊性而无法提供具体的建议。
ub

2
点周围的缓冲区大小可变(基于点的z值)。我想仍然进行焦点统计,您必须将结果点按z值向上分割,并在每组上进行栅格和焦点统计(使用z作为最大邻域上的圆形邻域的半径)。然后使用最大统计值对所有9个栅格运行像元统计,以便将结果组合在一起。(这可能仍比使用大数据集缓存和栅格化要快得多。)
blord-castillo 2012年

Answers:


10

某些算法更改将对您有所帮助。

合并或集成之前,请先执行选择。这将大大减少以后最昂贵的功能。

合并和集成都占用大量内存,因此,在引入要素类时,您要避免删除要素,并尝试在二叉树中进行合并,以减小合并和集成的规模。例如,对于四个shapefile,您合并两个shapefile并进行集成;合并另外两个shapefile并进行整合;合并两个结果要素类并进行集成。

您的作业队列从shapefile引用队列开始。您还可以将结果放入结果队列。您的并行处理工作者的run()方法将执行以下操作:将两个项目从队列中取出。如果没有任何物品(队列为空),请终止该工作程序。如果采用一项,则将该项目直接放入结果队列。

如果采用两项,则每项:如果是shapefile,则选择z <10并创建一个in_memory要素类;否则,它已经是in_memory要素类,并跳过选择步骤。合并两个in_memory要素类以创建新的in_memory要素类。删除原来的两个要素类。对新要素类执行集成。将该要素类放入结果队列。

然后运行一个外部while循环。循环从shapefile队列开始,并测试其长度是否大于1。然后循环通过工作进程运行队列。如果结果队列的长度大于1,则while循环将通过工作程序执行另一个并行处理,直到结果队列为1 in_memory要素类。

例如,如果您以3500个shapefile开头,则第一个队列将有3500个作业。第二名将有1750个工作岗位。875、438、219、110、55、28、14、7、4、2、1。最大的瓶颈将是记忆。如果您没有足够的内存(如果是这种情况,那么您将在创建第一个结果队列时耗尽内存),然后修改算法以一次合并两个以上的要素类,然后进行集成,这将减少您的第一个结果队列的大小,以换取更长的处理时间。(可选)您可以编写输出文件,并使用in_memory要素类跳过。这将大大降低您的速度,但会克服内存瓶颈。

只有在对所有shapefile进行合并和集成之后(以一个要素类结束),才可以执行缓冲区,多边形到栅格并重新分类。这样,这三个操作仅执行一次,即可使几何简单。


如果您的数据适合内存,则使用+1以使用in_memory工作空间。它大大加快了地理处理操作的速度。
瑞安·道尔顿

这是好东西。我认为使用图表和一些伪代码(或真实代码!)可能会更好。
blah238

是的,我希望我有一些时间致力于编写代码。无论如何,我都需要编写一个新的并行处理演示脚本。
blord-castillo 2012年

14

我要做的第一件事是使用Windows 7中的Resource Monitor或Vista / XP中的perfmon之类的工具监视系统的资源利用率,以了解是否受CPU内存IO限制

如果内存或IO受限,那么您几乎无能为力,只能升级硬件,减小问题大小或完全改变方法。

如果确定自己受CPU限制,我将尝试使用该multiprocessing模块或其他许多可用的基于Python的并行处理程序包之一,以查看是否可以使用更多的CPU内核来加快操作速度。

通常,进行多处理和并行处理的技巧是找到一种好的分区方案,该方案可以:

  1. 允许您将输入分成较小的工作集,然后以有意义的方式重新组合结果,
  2. 增加最少的开销(与串行处理相比是不可避免的),并且
  3. 允许您调整工作集的大小,以最佳利用系统资源以获得最佳性能。

您可以将我在此答案中创建的脚本用作起点:将用于生成建筑阴影的Avenue代码移植到ArcPy / Python for ArcGIS Desktop?

另请参阅ESRI地理处理博客文章,主题为: Python多重处理–方法和注意事项

我认为,由于您使用的工具具有更多的“黑匣子”性质,而不是我正在使用的更细粒度的几何数组,因此您的案例将更具挑战性。也许使用NumPy数组可能会派上用场。

如果您想超越arcpy,我也遇到了一些有趣的阅读材料:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.