AppleScript 経由で InDesign XMLElement を追加する際のパフォーマンスを向上させるにはどうすればよいですか?
-
08-06-2019 - |
質問
Adobe InDesign ドキュメント内に XML タグと要素を作成する AppleScript プログラムがあります。データはテーブル内にあり、各セルのタグ付けには 0.5 秒かかります。スクリプト全体が完了するまでに数時間かかります。
内部ループのコードを投稿することはできますが、SO が汎用的なものであるべきか特定的なものであるべきかはわかりません。暴徒に決めてもらうよ。
編集]コードは、テーブルに1行ごとに1つのアイテムが含まれるリスト(このループの前)を作成します。テーブルの各列に 1 つの文字列を含むリストもあります。プログラムは、セルごとに、2 つのリストの [行]/[列] 位置の項目を連結することにより、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
編集:正しい答えをよりよく反映するために質問を言い換えました。
解決 2
私はこれを考え出しました。
ドキュメントには多数のデータ テーブルが含まれています。合計で約 7,000 のデータ ポイントをエクスポートする必要があります。私は 7,000 個の子を持つ 1 つのルート要素を作成していました。
そんなことはしないでください。ルート要素に各子を追加すると、ますます遅くなり、約 5,000 個の子で AppleScript がタイムアウトになり、プログラムが中止されました。
解決策は、ルートから約 480 個の子を作成し、各子に約 16 人の孫を作成することで、コードをより脆弱にすることでした。ノード数は同じですが、コードは十分に高速に実行されるようになりました。(ドキュメントの処理には依然として約 40 分かかりますが、無限にかかる時間よりも無限に短い時間です。)
ちなみに、当初の子ども 7,000 人計画は、見た目ほど愚かでも怠惰でもありませんでした。新しい解決策では、私が制御していないテーブルのデータを使用して 2 つのテーブルをリンクする必要があります。本来あるべきではないスペースがたくさんあると、プログラムが壊れてしまいます。(しかし、それは機能します。)
他のヒント
問題はほぼ確実に選択です。とにかく一度にすべてのテキストを抽出して、内部変数を反復処理することはできますか?
内部ループのコードを投稿することはできますが、SO が汎用的なものであるべきか特定的なものであるべきかはわかりません。暴徒に決めてもらうよ。
例として投稿するコードは、あなた (または上司) が納得できる範囲で具体的にすることができます。多くの場合、より具体的な詳細を示したほうが簡単です。
内部ループのコードが適切な長さであれば、それを投稿できない理由はないと思います。Stack Overflow は、一般的な質問と具体的な質問の両方を網羅することを目的としていると思います。
InDesign または InDesign Server を使用していますか?あなたの文書は何ページですか (または、文書/ID の設定に関するその他の情報を教えてください)。
私は InDesign Server の開発をよく行っています。必ずしもコードに関連しているわけではない、いくつかの理由で速度低下が発生している可能性があります。
現在、100 ~ 300 ページのドキュメントを script/xml からほぼ完全に 100 秒ほどで生成しています (もっと大きなことをしているかもしれません)。