Как повысить производительность при добавлении InDesign XMLElements через AppleScript? - PullRequest
7 голосов
/ 14 августа 2008

У меня есть программа 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 ]

1 голос
/ 23 октября 2008

Я понял это.

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

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

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

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

1 голос
/ 26 августа 2008

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

0 голосов
/ 09 сентября 2008

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

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

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

0 голосов
/ 14 августа 2008

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

0 голосов
/ 14 августа 2008

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

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

...