Как повысить производительность при добавлении InDesign XMLElements через AppleScript?

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

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

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

Я совершенно новичок в 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

РЕДАКТИРОВАТЬ: я перефразировал вопрос, чтобы лучше отразить правильный ответ.

5 ответов

Решение

Я понял это.

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

Не делай этого. Добавление каждого дочернего элемента в корневой элемент становилось все медленнее и медленнее, пока не истекло около 5000 дочерних элементов AppleScript, и программа не была прервана.

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам