加速Arcpy python脚本、大数据

加速Arcpy python脚本、大数据,python,bigdata,arcpy,Python,Bigdata,Arcpy,我有一个非常简单的python脚本,它使用了arcpy模块。我在arcmap中将它变成了一个脚本工具,并以这种方式运行它。它工作得很好,我在小数据集上测试过多次。问题是我有大量的数据。我需要在一个包含4列和490481440行的.dbf表上运行脚本/工具,目前已经花了几天时间。有人对如何加快速度有什么建议吗?为了节省时间,我已经创建了在运行脚本之前将填充到表中的列。“back”表示“back_pres_dist”列中逗号后的第二个数字,“dist”表示第四个数字。我只想让他们在各自的专栏里。表和

我有一个非常简单的python脚本,它使用了arcpy模块。我在arcmap中将它变成了一个脚本工具,并以这种方式运行它。它工作得很好,我在小数据集上测试过多次。问题是我有大量的数据。我需要在一个包含4列和490481440行的.dbf表上运行脚本/工具,目前已经花了几天时间。有人对如何加快速度有什么建议吗?为了节省时间,我已经创建了在运行脚本之前将填充到表中的列。“back”表示“back_pres_dist”列中逗号后的第二个数字,“dist”表示第四个数字。我只想让他们在各自的专栏里。表和脚本如下所示:

back_pres_dist       back     dist
1,1,1,2345.6
1,1,2,3533.8
1,1,3,4440.5
1,1,4,3892.6
1,1,5,1292.0




import arcpy
from arcpy import env

inputTable = arcpy.GetParameterAsText(0) 
back1 = arcpy.GetParameterAsText(1) #the empty back column to be populated
dist3 = arcpy.GetParameterAsText(2) #the empty dist column to be populated

arcpy.CalculateField_management(inputTable, back1, '!back_pres_dist!.split(",")[1]', "PYTHON_9.3")
updateMess = arcpy.AddMessage("back column updated.")
arcpy.CalculateField_management(inputTable, dist3, '!back_pres_dist!.split(",")[3]', "PYTHON_9.3")
updateMess = arcpy.AddMessage("dist column updated.")

updateMess = arcpy.AddMessage("All columns updated.")

如有任何建议,将不胜感激。我知道将数据的某些部分读入内存可能会加快速度,但我不确定如何使用python(使用R时,读入内存花费了很长时间,试图写入.csv是一场噩梦)。

这是一堆数据。我猜您的主要瓶颈是磁盘上的读/写操作,而不是CPU或内存

您的流程似乎根据恒定的输入值独立地修改每一行,这本质上是一种表格操作,并不真正需要GIS功能。因此,我肯定会考虑在
arcpy
环境之外执行此操作,以避免这种开销。虽然您可以使用新的
arcpy.da
功能将这些内容转储到numpy,但我认为这可能是一个瓶颈。似乎您应该能够使用其他库更直接地读取*.dbf文件

事实上,这个操作并不是真正的表格化;它实际上是关于迭代的。你可能想利用诸如“WITH”/“AS”关键字(PEP 343,Raymond Hettinger在youtube上也有一段不错的视频)或迭代器(参见PEP 234,255)之类的东西,它们一次只加载一条记录


除了这些通用的编程方法之外,我认为最好的方法是将这些数据分解成块,并行化,然后重新组装结果。并行化工程的一部分可能是将数据分布在不同的磁盘上,以避免i/o请求之间的竞争。是python的一个附加组件,它有一个非常易于使用的高级包,“parallel”,如果您想从一个简单的地方开始的话。youtube上有很多来自PyCon 2012的精彩视频。有一个例子,并行的东西在2:13:00左右开始。

有人知道如果我严格地将它作为python使用,而不将它转换为arcMap工具,这会更快吗?这会有所不同吗?仍然希望有任何建议可以加速这一过程。如果您想继续在arcpy中进行此操作,请在数据访问模块中使用。这将使您的处理时间大约减少一半(我甚至怀疑会更多)。当您运行calculate字段时,它将迭代每一行。因为调用了两次,所以整个表迭代了两次。哦,这真的很奇怪,我以前使用过arcpy.da.UpdateCursor,但从某个地方读到计算字段会更有效(这是da.UpdateCursor按行读取的另一种方式)。谢谢你的提示!这太好了,非常感谢您提供的所有有用信息。我不经常处理这么多数据,所以这是一场斗争。希望在没有arcpy的情况下,使用块和并行化可以达到目的。当然可以。一定要看看那个视频,和一个搞砸了并行化的人谈谈。这是一种不同的思维方式。其他并行软件包也可能工作得更好,尤其是如果您或助手在我提到的内容之外的其他方面已经熟练掌握了。也可以在stackoverflow或GistackExchange中搜索dbf读取器包。