Tengo un script Applescript que ejecuto por lotes en una aplicación de edición de fotografías (Seize One). Es generado automáticamente por otra aplicación y crea colecciones inteligentes a partir de una base de datos de palabras clave. Es bastante largo y con el tiempo se vuelve cada vez más largo porque de vez en cuando se agregan más palabras clave. Por el momento tiene unas 50.000 líneas y 5 MB de longitud. Su funcionamiento es bastante lento (varias horas), pero este es otro asunto (en cualquier caso, lo ejecuto durante la noche varias veces al año). Llevo funcionando sin problemas desde hace un par de años.
El script es básicamente un bucle desenrollado de aproximadamente 3.600 iteraciones, cada una de las cuales hace básicamente las mismas cosas con diferentes datos. Ha crecido bastante recientemente porque agregué algunas líneas para calcular el tiempo estimado de finalización. Ahora parece que nunca se completa, porque en cierto punto (más o menos 2/3 del script, no siempre en el mismo punto) se imprimen algunos mensajes de error extraños en la consola (un extracto aquí):
Catalog 2024-11-23T00:57:01.192162Capture One received an error: Can’t make doc into kind integer.4-1700
make
group, Seize One received an error: Can’t make progress complete models into kind textual content., title, -1700
Catalog 2024-11-23T00:57:01.192162
«class prdt», Seize One received an error: Can’t make make into kind textual content., form, -1700
group
y poco después se produce una falla de segmentación. Creo que hay algún tipo de corrupción de memoria, por lo que la salida de la consola no tiene sentido. La inspección del bloque de código donde falla el script no muestra problemas, y si ejecuto el mismo script nuevamente, el bloqueo puede ocurrir un poco antes o después, por lo que el código no es relevante.
El script se ejecuta mediante línea de comando con osascript
.
¿Existe alguna limitación en la longitud de un Applescript? ¿Concepts? ¿Soluciones alternativas? Anticipo que dividir el script o reanudarlo desde el punto en que se detuvo no es una opción fácil para mí, por varias razones relacionadas con las API de Seize One.
Gracias.
PD: He dicho que no creo que el código sea relevante; de todos modos, esto es una iteración:
attempt
set progress textual content to "Importing: Workflow/workflow:printed/workflow:printed#twitter-weekly"
inform _workflow_published to make assortment with properties {form:sensible album, title:"workflow:printed#twitter-weekly", guidelines:"<?xml model="1.0" encoding="UTF-8"?><MatchOperator Variety="AND"><Situation Enabled="YES"><Key>IB_S_CONTENT_KEYWORDS</Key><Operator>6</Operator><Criterion>workflow:printed#twitter-weekly</Criterion></Situation></MatchOperator>"}
set progress accomplished models to 3670
set ___elapsedtime to (present date) - ___basetime
set ___ct to ___elapsedtime * 0.000272
set ___completionTime to "" & (___ct div 60) & " minutes to finish"
set ___eta to time string of ((present date) + ___ct)
set progress further textual content to "3670 / 3671 — 99% " & ___completionTime & " " & ___eta & ""
on error errorMessage quantity errorNumber
log "errorMessage: " & errorMessage & ", errorNumber: " & errorNumber
log ">>>> key phrase: Workflow/workflow:printed/workflow:printed#twitter-weekly"
finish attempt