9 votos

Maximizar el uso de la CPU

Mi script es la intersección de líneas con polígonos. Es un proceso largo, ya que hay más de 3000 líneas y más de 500000 polígonos. Me ejecutado desde PyScripter:

# Import
import arcpy
import time

# Set envvironment
arcpy.env.workspace = r"E:\DensityMaps\DensityMapsTest1.gdb"
arcpy.env.overwriteOutput = True

# Set timer
from datetime import datetime
startTime = datetime.now()

# Set local variables
inFeatures = [r"E:\DensityMaps\DensityMapsTest.gdb\Grid1km_Clip", "JanuaryLines2"]
outFeatures = "JanuaryLinesIntersect"
outType = "LINE"

# Make lines
arcpy.Intersect_analysis(inFeatures, outFeatures, "", "", outType)

#Print end time
print "Finished "+str(datetime.now() - startTime)


Mi pregunta es: ¿hay una manera de hacer que la CPU funcione al 100%? Se está ejecutando en el 25% de todo el tiempo. Supongo que el script se ejecute más rápido si el procesador al 100%. Mal guess?
Mi equipo es:

  • Windows Server 2012 R2 Standard
  • Procesador: Intel CPU Xeon E5-2630 0 @2.30 GHz 2.29 GHz
  • Memoria instalada: 31,6 GB
  • Tipo de sistema: Sistema Operativo de 64 bits, basado en x64 procesador


enter image description here

13voto

M. B. Altaie Puntos 11

Yo no estoy tan seguro de que este es un CPU de tareas. Me gustaría pensar que sería un I/O-bound operación, por lo que estaría buscando a utilizar la forma más rápida de disco a la que tuve acceso.

Si E: es una unidad de red, a continuación, la eliminación de ese sería el primer paso. Si no es un alto rendimiento de disco (<7ms buscar), entonces sería la segunda. Puede obtener algún beneficio de la copia de la capa de polígonos a un in_memory espacio de trabajo, pero el beneficio puede ser dependiente del tamaño de la clase de entidad poligonal, y si está usando 64-bits de procesamiento en segundo plano.

Optimizar el rendimiento de e/S es a menudo la clave para el rendimiento de SIG, así que yo te recomiendo prestar menos atención al medidor de CPU y más atención a la red y disco metros.

13voto

MTilsted Puntos 245

Déjame adivinar: Su cpu de 4 núcleos, por lo que el 25% de uso de cpu, es de 100% de uso de un núcleo, y 3 de inactividad de los núcleos.

Así que la única solución es hacer que el código de múltiples subprocesos, pero que no es tarea sencilla.

4voto

kwutchak Puntos 232

He tenido problemas similares de rendimiento con respecto a arcpy secuencias de comandos, el principal cuello de botella no está CPU es la unidad de disco duro, si usted está utilizando los datos de la red que es el peor escenario, pruebe a mover los datos a la unidad SSD, a continuación, inicia la secuencia de comandos desde la línea de comandos no de pyscripter , pyscripter es un poco más lento, puede ser debido a que contiene algunos de depuración de cosas, si usted no está satisfecho de nuevo, piense en paralelo a la secuencia de comandos, ya que cada python hilo lleva un núcleo de la CPU, la CPU es de tener 6 núcleos, así que usted puede lanzar 6 secuencias de comandos de forma simultánea.

3voto

user35456 Puntos 33

Como se dijo antes, usted debe utilizar el multiprocesamiento o roscado. Pero aquí viene la advertencia: El problema debe ser divisible! Así que eche un vistazo a https://en.wikipedia.org/wiki/Divide_and_conquer_algorithms.

Si su problema es divisible se procedería como:

  • Crear una cola donde se almacenan los datos de entrada para el proceso/subproceso
  • Crear una cola, donde los resultados son almacenados en
  • Crear una clase o función que se puede utilizar como un proceso/subproceso que resuelve nuestro problema

Pero como geogeek ha dicho, puede que no sea una limitación de CPU problema, sino una IO. Si tienes suficiente RAM puede pre-cargar todos los datos y, a continuación, el proceso, el cual tiene la ventaja de que los datos se pueden leer de un tirón por lo tanto no siempre interrumpir el proceso de cálculo.

3voto

Mehrdad Puntos 10388

Yo no estoy familiarizado con PyScripter, pero si es respaldado por CPython, entonces usted debe ir para el multiprocesamiento y no multi-threading mientras que el problema en sí es divisible entre (como otros ya mencionados).

CPython tiene un Bloqueo Global de Intérprete, que cancela los beneficios que varios subprocesos podría traer en su caso.

Para asegurarse de que en otros contextos python hilos son útiles, pero no en los casos en los que la CPU.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X