0

我有一个使用 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 是一场噩梦)。

4

1 回答 1

1

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

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

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

除了那些通用的编程方法之外,我认为最好的办法是将这些数据分成块,并行化,然后重新组合结果。并行化工程的一部分可能是将数据分布在不同的磁盘盘片上,以避免 i/o 请求之间的竞争。iPython是 python 的一个附加组件,如果你想要一个简单的起点,它有一个非常易于使用的高级包,“并行”。youtube 上有很多来自 PyCon 2012 的非常好的视频。有一个 3 小时的视频,其中并行内容从 2:13:00 左右开始。

于 2013-09-06T17:00:53.847 回答