Примечание. Хотя на этот вопрос есть ответ, любые дополнительные советы по оптимизации работы курсора будут с благодарностью. Я буду следить за любыми обновлениями.
В настоящее время мой босс (который работает в Avenue) и я (работающий в Python) пытаются решить одну и ту же проблему. Скорее, мы оба решили это, но скорость, с которой работают наши решения, ... разобщена, если не сказать больше. То, что его сценарий обрабатывает за 2 часа, может занять у меня до 6. Единственное реальное различие в синтаксисе и реализации в логике заключается в растровых изображениях 3.x и курсорах 10.x. Мы оба:
1) Сохраните значения из таблицы 1.
2) Используйте эти значения для запроса строки в таблице 2.
3) Сохраните значения из таблицы 2 для вставки в таблицу 3 в качестве новой строки.
В обоих сценариях эти процессы выполняются в два вложенных цикла. Прежде чем я углублюсь в удивительный мир оптимизации кода, это ожидаемое событие при сравнении производительности скрипта Avenue с Python? Это не первый раз, когда его сценарии значительно превосходят мои по времени работы, поэтому я хотел бы знать, есть ли что-то, о чем я должен знать, прежде чем распять себя за ужасные сценарии.
Вот мой сценарий без посторонних битов:
import arcpy
import time
import sys
import os
def recordfindcopy(inFile,query,outFile):
findRecord = arcpy.SearchCursor(inFile,query)
for record in findRecord:
copyRecord = arcpy.InsertCursor(outData) # <--- D'oh! (See answer)
field = record.FIELD
copy = copyRecord.newRow()
copy.FIELD = field
copyRecord.insertRow(copy)
StreetsFileList = [r"Path",
r"Path"]
for sfile in StreetsFileList:
inStreets = sfile
inTable = r"Path"
outData = r"Path"
fsaEntry = arcpy.SearchCursor(inTable)
for row in fsaEntry:
id = row.ID
sQuery = "ID = %s " % (str(id))
recordfindcopy(inStreets,sQuery,outData)
РЕДАКТИРОВАТЬ : Учитывая некоторые комментарии до сих пор, я задаюсь вопросом, может ли быть лучший способ сделать это с помощью объединений, хотя я сомневаюсь, учитывая brobdingnagian (слово дня!) Размер таблиц. Суть обработки заключается в добавлении информации из одной таблицы к любым соответствующим записям во второй таблице и создании третьей таблицы, содержащей только важные поля. Я хотел попробовать это с помощью SDE, но это, кажется, не доступный вариант. Мысли? Я прошу прощения, если мои вопросы всегда так вовлечены , но я пытаюсь докопаться до давнего раздражения.
Ответ : простое предложение Якуба уменьшило время обработки с 30 секунд на 500 записей до 3 секунд на 500 записей. Повторная инициализация курсора вставки на каждой вставке значительно замедляет процесс (очевидно). Хотя это, возможно, не самая оптимизация, которую можно выполнить для этого процесса, если сравнивать со скоростью ArcView 3.x, в настоящее время этого достаточно для моих целей. Дальнейшие предложения очень приветствуются!