我有一个使用arcpy模块的荒谬简单的python脚本。我把它变成了arcmap中的一个脚本工具,并以这种方式运行它。它运行得很好,我在小数据集上多次测试过。问题是我有大量的数据。我需要在一个包含4列和490,481,440行的.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 )。
答案 0 :(得分:1)
这是一大堆数据。我猜你的主要瓶颈是磁盘上的读/写操作,而不是CPU或内存。
您的进程似乎根据常量输入值独立地修改每一行,这实际上是一个并不真正需要GIS功能的表格操作。因此,我肯定会考虑在arcpy
环境之外执行此操作以避免此开销。虽然您可以使用新的arcpy.da
功能将这些内容转储到numpy,但我认为即使这可能是一个瓶颈。似乎您应该能够使用不同的库更直接地读取* .dbf文件。
实际上,这个操作并不是真正的表格;它真的是关于迭代。您可能希望利用“WITH”/“AS”关键字(PEP 343,Raymond Hettinger在youtube上也有一个很好的视频)或一般的迭代器(参见PEP 234,255),它们只加载一条记录一次。
除了那些通用编程方法之外,我认为最好的办法是将这些数据分成块,并行化,然后重新组合结果。并行化工程的一部分可能是将数据分布在不同的磁盘盘片上,以避免I / O请求之间的竞争。 iPython是python的附加组件,如果你想要一个简单的起点,它有一个非常易于使用的高级别的“并行”。来自PyCon 2012的youtube上有很多非常好的视频。有一个3 hour one,并行的东西在2:13:00左右开始。