Сведения о вопросе

Kimsanov

06:51, 7th August, 2020

Теги

Как я могу улучшить производительность при добавлении InDesign XMLElements через AppleScript?

Просмотров: 465   Ответов: 5

У меня есть программа AppleScript, которая создает XML тегов и элементов в документе Adobe InDesign. Данные находятся в таблицах, и пометка каждой ячейки занимает .5 секунд. Весь сценарий занимает несколько часов, чтобы закончить.

Я могу опубликовать код внутреннего цикла, но я не уверен, что SO должен быть общим или конкретным. Я предоставлю решать мафии.

[редактировать] Код создает список (до этого цикла), который содержит по одному элементу на строку в таблице. Существует также список, содержащий одну строку для каждого столбца в таблице. Для каждой ячейки программа создает элемент XML и тег XML, объединяя элементы в позициях [строка]/[столбец] двух списков. Он также связывает текст в этой ячейке с вновь созданным элементом.

Я совершенно новичок в AppleScript, поэтому часть этого кода грубо модифицирована из образцов Adobe. Если кодекс ужасен, я не обижусь.

Вот этот код:

repeat with columnNumber from COL_START to COL_END

    select text of cell ((columnNumber as string) & ":" & (rowNumber as string)) of ThisTable

    tell activeDocument

        set thisXmlTag to make XML tag with properties {name:item rowNumber of symbolList & "_" & item columnNumber of my histLabelList}

        tell rootXmlElement

            set thisXmlElement to make XML element with properties {markup tag:thisXmlTag}

        end tell

        set contents of thisXmlElement to (selection as string)

    end tell

end repeat

EDIT: я перефразировал вопрос, чтобы лучше отразить правильный ответ.



  Сведения об ответе

fo_I_K

14:27, 24th August, 2020

Проблема почти наверняка заключается в выборе. Есть ли вообще возможность извлечь весь текст сразу, а затем перебирать внутренние переменные?


  Сведения об ответе

$DOLLAR

00:50, 11th August, 2020

Вот это я уже понял.

Документ содержит кучу таблиц данных. В целом, существует около 7000 точек данных, которые необходимо экспортировать. Я создавал один корневой элемент с 7000 детьми.

Не делай этого. Добавление каждого дочернего элемента к корневому элементу становилось все медленнее и медленнее, пока примерно в 5 000 children AppleScript не истекло время ожидания и программа не прервалась.

Решение состояло в том, чтобы сделать мой код более хрупким, создав ~480 детей от корня, причем у каждого ребенка было около 16 внуков. Такое же количество узлов, но код теперь работает достаточно быстро. (Обработка документа по-прежнему занимает около 40 минут, но это бесконечно меньше времени, чем бесконечность.)

Кстати, первоначальный план 7000 детей не был таким глупым или ленивым, как кажется. Новое решение вынуждает меня связать две таблицы вместе, используя данные в таблицах, которые я не контролирую. Теперь программа сломается, если есть хоть одно место, где ее не должно быть. (Но это работает.)


  Сведения об ответе

DAAA

04:12, 6th August, 2020

Я могу опубликовать код внутреннего цикла, но я не уверен, что SO должен быть общим или конкретным. Я позволю толпе самой решать.

Код, который вы публикуете в качестве примера, может быть настолько конкретным, насколько вам (или вашему боссу) удобно - чаще всего, вам легче помочь с более конкретными деталями.


  Сведения об ответе

+-*/

20:03, 14th August, 2020

Если код внутреннего цикла имеет разумную длину, я не вижу причин, по которым вы не можете его опубликовать. Я думаю, что переполнение стека предназначено для охвата как общих, так и конкретных вопросов.


  Сведения об ответе

dump

10:20, 19th August, 2020

Вы используете InDesign или InDesign сервер? Сколько страниц занимает ваш документ (или какую другую информацию вы можете сообщить нам о настройке document/ID)?

Я много занимаюсь разработкой серверов InDesign. Вы можете наблюдать замедление по нескольким причинам, которые не обязательно связаны с кодом.

Прямо сейчас я генерирую 100-300 страниц документов почти полностью из script / xml примерно за 100 секунд (возможно, вы делаете что-то гораздо большее).


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться