I never had to worry about using up too much memory these days because my E2900 has 32Gb of RAM, so I would always build an enormous hash in memory. 100Mb doesn't sound like too much data at all, I would build a hash in memory with the sender id as the key, then the messages in the array:
my %log = (
'user1' => [ 'msg1',
'msg2',
...
],
'user2' => ...
);
Nowadays even a half decent machines should have plenty of memory. I'd say just read into memory and write out one user at a time.