If you'd accumulated 300K file objects in an array and then began processing them doing a garbage collection wouldn't have much of an effect. Doing a garbage collection after releasing the array (e.g. $array = $null, or $array = @()) might be beneficial, but only if there was a lot going on in the script after you're done with the array. Also possible is the removal from the array of the item just processed in the loop. After, say, removing 1000 items from the array you'd release some memory -- but at the expense of resizing the array repeatedly, and that would also consume memory and significant time,
That's one of the reasons I suggested piping the list of files directly into the loop rather than storing the results in an array. There's no large amount of storage consumed by the array.
I was going to suggest upgrading to release 5.1, but you didn't mention if there was any dependence on a particular version of PowerShell so I assumed(!) that there might be.