"It makes no sense to read the entire file into an array .... and almost certainly speed the whole thing up considerably."
Oh, certainly. I had temporarily rewritten it this way to see if the slowness was due to readng the file or processing it.
Unfortunately the sparse representation I'm using is necessary for the way the data structure will be applied; each record has about 30 features, but which features each record has varies among a set of about 150,000, making any representation which stores the values of all features for all records impractical. I also unfortunately must have all the data in memory at once in order to calculate various infromation statistics for each attribute and to do extensive swapping of records (I'm building a decision-tree learner). :-(