I have a self-hosted WCF service (v4 framework) that is exposed through a HttpTransport-based custom binding. The binding uses a custom MessageEncoder
I've had some experience with WCF and streaming.
Basically, if you don't set the TransferMode to streamed, then it'll default to buffered. So if you are sending large pieces of data, it's going to build up the data on your end in memory and then send it once all the data is loaded and ready to be sent. This is why you were getting out of memory errors because the data was very large and more than your machine's memory.
Now if you use streamed, then it'll immediately start sending chunks of data to the other endpoint instead of buffering it up, making memory usage very minimal.
But this doesn't mean that the receiver also has to be set up for streaming. They could be setup to buffer and will experience the same problem as the sender did if they do not have sufficient memory for your data.
For the best results, both endpoints should be setup to handle streaming (for large data files).
Typically, for streaming, you use MessageContracts instead of DataContracts because it gives you more control over the SOAP structure.
See these MSDN articles on MessageContracts and Datacontracts for more info. And here is more info about Buffered vs Streamed.