2011-04-29 28 views
5

Buenos días chicos¿Cómo puedo optimizar o limitar el uso de la CPU a un proceso zip (DotNetZip) en C#?

Tengo una aplicación que uso para archivar una carpeta usando la biblioteca DotNetZip. Observé que cuando va al proceso real de "compresión", utiliza hasta el 100% de la CPU. Esta aplicación se usará junto con otra (una aplicación de chat tcp), así que realmente necesito que use la menor cantidad de CPU posible.

¿Hay alguna forma en que pueda limitar de forma segura la CPU? Intenté reducir la prioridad, pero no hace la diferencia. Lo único que tengo ahora es establecer la afinidad en 1 núcleo solo para que use el 50%. Pero, por supuesto, eso solo funcionaría en computadoras multi-core.

Respuesta

3

Bajar la prioridad es lo que quiere, no forzando necesariamente el proceso para usar solo una cantidad arbitraria de la CPU como 50%.

Esto significa que el proceso utilizará sin usar capacidad de procesamiento de la CPU, y que sus otros procesos más importantes todavía podrán funcionar casi como si el proceso de Zip no se ejecutara en absoluto.

Creo que el proceso de baja prioridad solo utiliza el 100% de la CPU porque nada más lo es. Una vez que haya puesto en marcha su (s) otro (s) proceso (s) y lo intente nuevamente, notará que el proceso de Zip no usará el 100%.

+1

Debería señalar que esto se puede hacer utilizando un subproceso de baja prioridad; no es necesario iniciar un proceso separado para una biblioteca de códigos administrados al 100% como DotNetZip. –

1

Al reducir la prioridad, usted está haciendo lo que necesita hacer. Establecer la afinidad a uno también ayudará cuando corresponda.

Si otro proceso necesita CPU, su proceso con mucho gusto se apartará, por lo que el usuario no debería notar una desaceleración. No hay nada de malo en usar el 100% de la CPU a menos que la esté acaparando. En teoría, desea que su aplicación use la CPU cuando la necesita y la abandona cuando no la necesita.

6

DotNetZip se ejecutará en varios subprocesos de forma predeterminada, para ofrecer una compresión más rápida, a expensas de la CPU y la utilización de la memoria. En un sistema multinúcleo, esto puede consumir el 100% de todas sus CPU, dado un rendimiento de E/S suficiente.

Si no lo desea, puede configurar ZipFile.ParallelDeflateThreshold en -1. Esto dice "nunca uses múltiples hilos para comprimir". Esto consumirá toda la CPU que pueda obtener un único hilo; en una máquina de una sola CPU de un solo núcleo, que seguirá siendo el 100%. Un portátil típico de actualidad es una máquina de doble núcleo; exhibirá 50% de uso de la CPU en este caso, porque un núcleo estará completamente saturado.

Si está ejecutando en una máquina de varios núcleos y desea que su aplicación de comunicaciones tcp continúe sin impedimentos, puede Inicie DotNetZip en un hilo de fondo y establezca la propiedad que mencioné anteriormente. Para un mayor aislamiento, puede factorizar DotNetZip en un proceso separado y establecer la prioridad afinidad + en ese proceso, además de establecer la propiedad de umbral parellel.

+0

¡Esta propiedad funciona como un encanto! Muchas gracias @ Cheeso –

Cuestiones relacionadas