¿Cómo puedo acelerar la rotación de un enorme TIFF en 90 grados?

Estoy procesando enormes imágenes TIFF (escala de grises, 8 o 16 bits, hasta 4 GB) para usarlas como datos de entrada de alta resolución para una máquina. Cada imagen debe girarse 90 grados (en el sentido de las agujas del reloj). La entrada TIFF puede ser LZW o sin comprimir, la salida puede estar sin comprimir.

Hasta ahora he implementado mi propia clase de lector TIFF en Objective C (incluida la descompresión LZW) que es capaz de manejar grandes archivos y también hace un poco de almacenamiento en caché en la memoria. En este momento, la clase de lector TIFF se usa para visualización y medición dentro de la imagen y su rendimiento es bastante bueno.

Para mi último desafío, rotar un TIFF, necesito un nuevo enfoque, porque la implementación actual es MUY lenta. Incluso para un TIFF de tamaño "medio" (30.000 x 4.000) se tarda aprox. 30 minutos para rotar la imagen. En el momento en que recorro todos los píxeles y escojo el que tiene las coordenadas x e y invertidas, los coloco en un búfer y escribo el búfer en el disco tan pronto como se completa una línea. El principal problema es la lectura del TIFF, ya que los datos se organizan en tiras y no se garantiza que se distribuyan de manera lineal dentro del archivo (y en el caso de tiras comprimidas con LZW, tampoco hay nada lineal).

Perfilé mi software y descubrí que la mayor parte del tiempo se invierte en copiar bloques de memoria (memmove) y decidí omitir el almacenamiento en caché dentro de mi clase de lector para la rotación. Ahora todo el proceso es aproximadamente un 5% más rápido, lo que no es demasiado, y todo el tiempo ahora se pasa dentro de fread (). Supongo que al menos mi caché funciona casi tan bien como el caché fread () del sistema.

Otra prueba que usó Image Magick con el mismo archivo de 30.000 x 4.000 tomó solo unos 10 segundos. AFAIK Image Magick lee todo el archivo en la memoria, lo procesa en la memoria y luego vuelve a escribir en el disco. Esto funciona bien hasta unos cientos de megabytes de datos de imagen.

Lo que estoy buscando es algún tipo de "meta optimización", como otro enfoque para manejar los datos de píxeles. ¿Hay otra estrategia que cambiar los píxeles uno por uno (y la necesidad de leer desde ubicaciones de archivos muy alejadas entre sí)? ¿Debo crear algún archivo intermedio para acelerar el proceso? Cualquier sugerencia de bienvenida.

Respuestas a la pregunta(2)

Su respuesta a la pregunta