Transformaciones de imágenes paralelizadas usando gráficosMagick -- performance campo con android campo con image campo con concurrency campo con shell camp codereview Relacionados El problema

Parallelized image transformations using GraphicsMagick


2
vote

problema

Español

Esto es parte de un script que utilizo para portar un tema de TWRP de una resolución a otra, respectivamente, retrato a retrato y paisaje al paisaje. En esta función enteramente, se centra en las imágenes. Lo que no estoy mostrando es irrelevante ya que se enfoca en portuar los archivos XML.

Rec compilé graphicsmagick para el brazo y, por lo tanto, llámalo cuando es hora de cambiar el cambio de tamaño de cada imagen . GM puede ser un poco lento, así que incluyí un método que imita el concepto paralelo para ayudar a acelerar el proceso.

¿Es esto suficiente o hay un mejor enfoque que pueda tomar dado cómo opera esta parte del script?

  ...      public FileInfo LogFileInfo { get; internal set; }      public void Log(string message, string title, StatusType type, DateTime timestamp)     {         lock (syncObj)         {             CheckLogFileSize(); //rotates LogFileInfo through numbered log files              using (var stream = LogFileInfo.AppendText())             {                 stream.WriteLine(GetFormattedString(message, title, type, timestamp));                 stream.Flush();             }         }     }      public IAsyncResult LogAsync(string message, string title, StatusType type, DateTime timestamp, AsyncCallback callback)     {         var action = new Action<string, string, StatusType, DateTime>(Log);         return action.BeginInvoke(message, title, type, timestamp, callback, action);     }      public void EndLogAsync(IAsyncResult result)     {         ((Action)result.AsyncState).EndInvoke(result);     } 3  
Original en ingles

This is part of a script that I use for porting a TWRP theme from one resolution to another, respectively portrait to portrait and landscape to landscape. In this function entirely, it focuses on the images. What I am not showing is irrelevant since it focuses on porting the XML files.

I compiled GraphicsMagick for ARM and thus call on it when it is time to do the resizing of each image. GM can be a bit slow so I included a method which mimics the parallel concept to help speed up the process.

Is this sufficient or is there a better approach I can take given how this part of the script operates?

GOTOTWRPIMAGE() {      NUM=0     QUEUE=""     MAX_NPROC=$(grep "processor :" < /proc/cpuinfo | wc -l) # default     MAX_NPROC=$(($MAX_NPROC+1))  queue() {     QUEUE="$QUEUE $1"     NUM=$(($NUM+1)) }  regeneratequeue() {     OLDREQUEUE=$QUEUE     QUEUE=""     NUM=0     for PID in $OLDREQUEUE; do         if [ -d /proc/$PID ]; then             QUEUE="$QUEUE $PID"             NUM=$(($NUM+1))         fi     done }  checkqueue() {     OLDCHQUEUE=$QUEUE     for PID in $OLDCHQUEUE; do         if [ ! -d /proc/$PID ]; then             regeneratequeue # at least one PID has finished             break         fi     done }      if [ ! -f "${P_IMAGES}"/image_dir.txt ]; then         busybox touch "${P_IMAGES}"/image_dir.txt     else         rm -f "${P_IMAGES}"/image_dir.txt         busybox touch "${P_IMAGES}"/image_dir.txt     fi      # Find the images to be ported.     if output=$(find "${P_IMAGES}" -type f -iname "*.png" -o -iname "*.jpg"); then         echo "${output}" > "${P_IMAGES}"/image_dir.txt     fi      filename="${P_IMAGES}"/image_dir.txt     filelines=$(cat "${filename}")      for line in $filelines; do         # Remember the directory and filename         local IMAGEFILE="$(basename "${line}")"         local IMAGEFILEDIR="$(dirname "${line}")"          # Remember width and height         SIZEW=$(gm identify -format "%w" "${IMAGEFILEDIR}"/"${IMAGEFILE}")         SIZEH=$(gm identify -format "%h" "${IMAGEFILEDIR}"/"${IMAGEFILE}")          # Calculate old size for new size of each image.         # Round fractions up and down for each image.         FINALW=$(awk 'BEGIN{print int("'$BASEW'"/("'$PORTW'"/"'$SIZEW'")+0.5)}')         FINALH=$(awk 'BEGIN{print int("'$BASEH'"/("'$PORTH'"/"'$SIZEH'")+0.5)}')          # Inform user of the change and conduct the change         echo " "         echo Porting "${IMAGEFILE}" from $SIZEW'x'$SIZEH to $FINALW'x'$FINALH         # Convert image to new sizes         gm convert -size  $FINALW'x'$FINALH! "${IMAGEFILEDIR}"/"${IMAGEFILE}" -resize $FINALW'x'$FINALH! "${IMAGEFILEDIR}"/"${IMAGEFILE}" &          PID=$!         queue $PID          while [ $NUM -ge $MAX_NPROC ]; do             checkqueue             #sleep 0.4         done     done     wait # wait for all processes to finish before exit      if [ -f "${P_IMAGES}"/image_dir.txt ]; then         rm -rf "${P_IMAGES}"/image_dir.txt     fi      if [ $OPT == "1" ]; then         HEADSUP     fi } 
              

Lista de respuestas


Relacionados problema

3  Restablecer archivos en GIT que se muestran como modificados pero no tienen cambios de acuerdo con "Git Diff"  ( Reset files in git which show as modified but have no changes according to git ) 
Este parece para estar funcionando, pero también es bastante lento y me parece un poco hackeado. IFS=$' ' for currentFile in $(git status | grep "modifi...

2  Comparando si es, y condición de caso  ( Comparing if else and case condition ) 
Tengo un script utilizado para instalar pocos rpms dependiendo del tipo de sistema operativo. Aquí, en este ejemplo, el script instalará paquetes en dos "Cent...

6  Cáscara muy básica en el microcontrolador en C  ( Very basic shell on microcontroller in c ) 
Objetivo: Una cubierta ligera que se ejecuta en un microcontrolador (MSP430) y analiza los datos entrantes en un comando y adicionales parámetros. Requ...

7  Script shell para descargar y extraer un tarball de GitHub  ( Shell script to download and extract a tarball from github ) 
No quiero que se ejecute nada si falla algún paso anterior: var traversed = [] // Start this func with the every index of the last sub array (top or bottom...

3  Línea de comando FFMPEG para mostrar dos videos lado a lado  ( Ffmpeg command line for showing two videos side by side ) 
Aquí está la línea de comandos para jugar dos videos de lado a lado en sincronización en FFMPEG (FFPlay). Puede ser útil para los videos de comado, por ejempl...

10  Mini- (Docker) -Shell  ( Mini docker shell ) 
Me dieron una asignación para escribir una mini-shell: Para escribir su propia cáscara, deberá comenzar con un programa C que pedirá que el usuario ingre...

7  SHELL SCRIPT Image Replication  ( Shell script image replication ) 
Tengo un script de shell que se está utilizando en una interfaz de máquina humana incrustada (HMI). Este script se utiliza para copiar algunos archivos de una...

13  ¿Fue este script Shell listo para la fuente abierta? (Fondo de pantalla Random XKCD)  ( Was this shell script ready for open source random xkcd wallpaper ) 
Escribí el siguiente script de shell y lo publicé en github . En el repo, también hay un archivo README que explica cómo usarlo con más detalle. Esta es la...

2  Pasando las opciones de ayuda a un guión bash  ( Passing help options to a bash script ) 
Utilicé este código para dar, las opciones (ayuda) a mi guión de bash. Está funcionando bien y quería obtener el código revisado. while true; do if...

3  Funciones de manipulación de comando para un programa de concha de juguete  ( Command manipulation functions for a toy shell program ) 
Estoy escribiendo un pequeño programa que se supone que actúa como una concha de algún tipo. Funciona de unas pocas estructuras básicas, una de ellas es un 9...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos