項目の多いリストの注意

文字列のリスト化の問題

 文字列を大量のリストに変換する場合、スタック溢れ等のエラーが発生します。
 これはバグと思ってもいいくらいで、困ったことに、characterで分割すると簡単に起きるエラーです。
 リストに変換することが目的で無くても、内部的にリスト化しているとエラーとなるようです。以下のスクリプトのtheTextに大量の文字列を入れておけば、エラーとなります。
 大量といっても数10KB程度(リストにして4000項目程)です。

number of characters of theText

 ここではcharacters of theTextの部分で一旦リストに変換している為にエラーが発生してしまうようです。
 そこて以下のようにリストに分割せずに直接数を数えると、エラーが発生すること無く文字数を数えることができます。

number of theText

 ちなみに、number ofとcountはほぼ同義ですが、countを使っているとリスト化によるエラーとなりません。というのもcount命令の中で全て処理してしまうので、一旦リスト化されると言う事が無い、と考えられます。

count characters of theText

 もちろんcharacters of を省略しても構いません。これも当然ですがword等の場合は省略できません。

count theText

 どちらにせよ、AppleScriptは大量のデータの扱いが不得意で、あまり満足できるスピードで処理してくれるわけではありません。
 AppleScriptの次のバージョンに期待して、大量のテキストデータを扱うことの多い人は、MacJPerlという強力なしかもフリーの言語がMacでも使えるので、そちらを利用するのが利口でしょう。
 文字列の操作を行うならば、ほとんどあらゆる面でPerlの方が優れています。個人的にはAppleScriptで大量の文字列(テキストファイル)の処理を行うのは危険と考えてPerlを使うようにしてます。
 Perlは他言語なので、そこまで大袈裟にする必要が無い場合は、Tanaka's osax等のOSAXを使うというのもいい手です。

大量のリストの問題

 リストの量が増えると極端に処理速度が落ちてきます。
 代入・参照を行う項目の番号によって速度に差があるのでは無く、1番目の項目でも1000番目の項目でも、速度に差はありません。項目数が1つのリストを扱う場合と、項目数が1000個のリストを扱う場合に明らかな差があるのです。
 具体的には、以下のスクリプトのtheListの部分が{"項目一つだけ"}よりも{"一つ","二つ",...,"沢山"}のリストの方が遅いのです。

item 1 of theList

 これを回避する方法として、リストを分割する方法が考えられます。
 リストを分割する前処理が入るため、遅くなるとしか思えないのですが、元のリストが大きければ大きいほど効果が出ます。
 MacOS8.6(PPC603e,180MHz)で調べてみたところ、大雑把に1項目のリストと60項目のリストで速度に倍の差がでます。その後120項目で3倍、180項目で4倍と言う感じで直線的に遅くなっていきます。
 このことから、処理によって丁度良い大きさも違うでしょうが、50〜200項目程度を目安に分割するといいのでは無いかと思います。
 いつ改善されるとも限らないので、あまり変則的な処理はしないに限るというのも、一つの考えと言えます。

repeat with curItem in theList
	-- ループ処理
end repeat

 このループでcurItemに入るのはリストの中の値では無く、値への参照です。この部分ではリストの項目数による速度低下は無いと思って構いません。
 速度低下が起こるのは、リストから値を取り出す時です。


2000-05-09 -2000-06-02