Have you optimised your schema as much as possible? The two obvious first steps are:
1. Don't store data that is not needed for display.(Field ID's and meta data etc)
...and the opposite of that...
2. Don't index data is ONLY used for display, but not searched for. (Supplementary data)
And a quirky thing to try that sometimes works, and sometimes doesn't is changing the add/overwrite attribute to false.
<add overwrite="false">
This disables the unique id check (I think). So if you are doing a full wipe/replace of the index, and you are certain to only be adding unique documents, then this can speed up the import. It really depends on the size of the index though. If you have over 2,000,000 documents, and every time the indexer adds a new one, you gain a bit of speed by not forcing it to check if that document already exists. Not the most eloquent explanation, but I hope it makes sense.
Personally, I use the data import handler which cuts out the need for an intermediary script. It just hooks up to the db and sucks out the info it needs with a single query.