As I look through the collected responses to this thread so-far, I would suggest that there are two general approaches that are being (equally seriously ...) offered:
-
If the total number of output-files is both “truly unpredictable” and “can be counted-on to be small,” then it is possible to have all of the possible output-files open at the same time. As long as you are sure that the operating system won’t object (fatally... as operating-systems are wot to do when their Godly Prerogatives are crossed by Mere Mortals), then you can simply throw each incoming record into the appropriate (simultaneously...) open bucket.
-
If this is not the case, then you probably are going to need to sort the incoming records first. This, by definition, will cause all records having an identical key-value to be physically adjacent ... so that all of the records that are destined for any particular destination are adjacent ... so that you can meaningfully react to a change in the destination, with no need to remember history. The advantage of this approach is, of course, that there is never more than one destination-bucket (file..) open at any one time. The disadvantage is “the overhead of sorting.” (Which may, actually, be quite acceptable. There is, indeed, a reason why one of Dr. Knuth’s seminal books was titled: Sorting and Searching ...)