[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

slow list of package names in low-memory install



While using the Debian installer in low-memory mode to put a Debian system
onto a NSLU2 (ARM processor with 32MB RAM), I noticed that the installer
seemed slow.  Running "ps" repeatedly in a concurrent session, I often
saw about 80 processes per second, and many command lines of the form:
  [ <package1> = <package2> ]
which tests if two package names are the same.  I'm guessing that this is
to construct a set represented as a list, such as a list of required
packages with no duplicates.  Doing this sequentially takes quadratic time.
If '[' is built in to the shell, then it can be fast enough anyway.

Unfortunately, in the low memory installer '[' is not a shell builtin.
'[' is a tracked alias to /usr/bin/[ which is in busybox.  Therefore,
there is a complete fork+exec for each '[' command.  This is slow
enough to cause a delay of many seconds each time the installer
manipulates the list containing hundreds of packages.

A faster way to manipulate such a list is to build it as lines in a file:
   rm -f list_1; > list_1     # create empty list
   rm -f list_1; touch list_1   # create empty list
   echo "$i" >>list_1         # add element to list  [echo is builtin]
   grep -q "^$i\$" list_1     # test for membership
   cat list_1                 # retrieve the list
   rm -f list_1               # destroy the list

Perhaps even faster is to use filenames in a temporary directory:
   rm -f /tmp/list_1; mkdir -p /tmp/list_1       # create empty set
   > /tmp/list_1/"$i"         # add element to set (no test needed!)
   touch /tmp/list_1/"$i"     # add element to set (no test needed!)
   [ -e /tmp/list_1/"$i" ]    # test for membership
   ls /tmp/list_1             # retrieve the set
   rm -rf /tmp/list_1         # destroy the set

-- 



Reply to: