Actualmente estoy teniendo lo que parece ser un problema de escalado con arcpy, actualización de cursores de da y grandes geodatabases de archivos.
Tengo un fragmento de código que itera a través de cada elemento en una clase de elementos y realiza algunos cálculos y manipulaciones en los datos. Funciona muy bien para conjuntos de datos más pequeños, pero es órdenes de magnitud más lento en los grandes. Tengo un contador simple y declaraciones de impresión cada 1000 registros con el propósito de hacer una evaluación y estos son los resultados:
- 48k elementos, cada 1000 tarda ~0.12 segundos en hacer
- 133k elementos, cada 1000 tarda ~0.12 segundos en hacer
- 2 millones de elementos, cada 1000 tarda ~0.17 segundos en hacer
- 48 millones de elementos, cada 1000 tarda ~23 segundos en hacer (sí, veintitrés segundos, sin lugar decimal)
Solo dejé correr los 48 millones durante unos minutos antes de detenerlo, pero el resto se ejecutaron hasta completarse y estos tiempos son muy consistentes, ya sea el primero o el último, con solo unos centésimos de desviación de vez en cuando. Incluso si estuvieran escalando linealmente, solo esperaría .05 segundos cada 2 millones de registros y eso pondría los 48 millones en algún lugar del área de 1.3 segundos. Los resultados son 20 veces eso.
Los que tienen menos elementos son solo subconjuntos de los datos para fines de prueba, por lo que no debería ser un problema con diferencias en los datos. Todos fueron creados de la misma manera, por lo que no creo que haya un problema con diferencias en los datos aparte del tamaño. Parece que proviene puramente del número de elementos.
Lo siento, no tengo el código exacto conmigo en este momento, está en el trabajo, pero esto es básicamente esto. El código en sí funciona bien, sin embargo, me pregunto si alguien ha tenido problemas similares con grandes conjuntos de datos. Pensaba que podría ser un error de fuga de memoria, pero todos estos se ejecutan fuera de Arc en la ventana de python y esperaría que una fuga de memoria tomaría tiempo para aumentar (ralentizar) con el tiempo en lugar de ser instantáneamente mucho más lento.
import arcpy
from datetime import datetime
...
i = 0
fromlast = datetime.now()
with arcpy.da.UpdateCursor(fc, fields) as rows:
for row in rows:
if i % 1000 == 0:
now = datetime.now()
print i, ': ', now - fromlast
fromlast = now
###hacer cosas aquí
rows.updateRow(row)
i += 1
Solo tengo ArcGIS (licencia de ArcInfo), gdal/ogr2ogr y python para trabajar, pero no estoy fijo en usar el FGDB o cursores da si hay una mejor manera de hacerlo dentro de mi selección limitada de herramientas.