Cards vs Listfield/custom properties revisited
J. Landman Gay
jacque at hyperactivesw.com
Thu Jan 24 13:40:52 EST 2008
Lars Brehmer wrote:
> I followed the discussion about using stacks of many cards vs. a
> listfield vs. a custom property vs. a database.
>
> I use a data stack with around 5,000 cards with anywhere from 4 or 5 to
> over a hundred custom properties in each (out of 250 possible), so I
> decided to try everyone's advice. I created a custom property with 1
> line with up to 250 items for each of the data cards.
>
> My first speed tests were quite promising at first (example: what took
> 1765 milliseconds the card way took just 60 milliseconds the new way.)
> Being a non coder type (please be patient with my lack of expertice), I
> haven't been able to find ways to translate all of the search and sort
> operations I do. Most things rely on the very basic
>
> mark cards where some custom property = some condition
> lock screen
> lock messages --the data stack has an openCard handler that affects my
> main stack
> repeat for q = 1 to the num of marked cards
> go next marked card
> do something
> end repeat
> unmark all cards
> --mark cards the way they were before this operation
> unlock messages
> unlock screen
The bottleneck here is the "go" statement. Even with locked messages and
a locked screen, it takes a long time to go to a card. In most cases, a
repeat loop can be changed to use remote references to cards, which are
much faster:
repeat with q = 1 to the num of marked cards
do something to fld "myfield" of cd q -- remote reference
end repeat
Just this one change will increase the speed of the repeat loop
tremendously. This doesn't address your question about dropping the
card-based storage in favor of variable-based storage though.
>
> While this has always been fast enough for me, I am trying to learn
> better ways to do things, but after trying such things as filter with or
> match etc, I have found no way do something that has the same result as
> "mark cards where ...". Is there anything that would have the effect of
> the (apparently not possible) command "mark lines in it where ..."? I
> suppose it would look something like this:
>
> put the mData of this stack into gData --loads that big custom prop
> somehow get rid of lines where something is not in a certain item of
> those lines
> set the tempData of this stack to gData
> do things with the tempData of this stack
I wrote a school library system that uses the variable-based approach
that addresses these things. For the most part, sorting is very easy:
sort lines of tData by item <whatever> of each
Finding things takes a little more effort, but can duplicate the marked
card approach. The "repeat for each" structure is very fast and can be
used effectively to find data in the variable in many different ways.
For example, to find all instances of "dog" in the variable:
repeat for each line L in tData
if tData contains "dog" then put L & cr after tOutput
end repeat
The variable "tOutput" now contains only those lines that have the
string "dog" embedded anywhere. If you only want to find whole items
that equal "dog":
repeat for each line L in tData
if "dog" is among the items of L then put L & cr after tOutput
end repeat
You can do combined searches too; for example, if you want to find
either "dog" or "cat" as whole items:
repeat for each line L in tData
if "dog" is among the items of L or "cat" is among the items of L
then put L & cr after tOutput
end repeat
Or only those lines containing both "dog" and "cat" as individual items:
repeat for each line L in tData
if "dog" is among the items of L and "cat" is among the items of L
then put L & cr after tOutput
end repeat
There are endless variations to this. You can find all lines that
contain one thing but specifically do not contain another:
repeat for each line L in tData
if "dog" is among the items of L and "cat" is not among the items of L
then put L & cr after tOutput
end repeat
And so forth.
--
Jacqueline Landman Gay | jacque at hyperactivesw.com
HyperActive Software | http://www.hyperactivesw.com
More information about the use-livecode
mailing list