See the question and my original answer on StackOverflow

The important thing is to make sure you never load the whole file, but "stream" (in the general sense, stream bytes, characters, xml nodes, etc.) everything from end to end (ie: server to client here).

For network bytes, it means you must use a raw Stream object.

For Xml nodes, it means you can use an XmlReader (not an XmlDocument which loads a full document object model from a stream). In this case, you can use an XmlTextReader which "Represents a reader that provides fast, non-cached, forward-only access to XML data".

Here is a C# piece of code (that can easily be translated to VB.NET) that does this, but can still build an intermediary small Xml document for each product in the big Gb file, using XmlReader methods ReadInnerXml and/or ReadOuterXml:

var req = (HttpWebRequest)WebRequest.Create("https://www.yourserver.com/spotahome_1.xml");
using (var resp = req.GetResponse())
{
    using (var stream = resp.GetResponseStream())
    {
        using (var xml = new XmlTextReader(stream))
        {
            var count = 0;
            while (xml.Read())
            {
                switch (xml.NodeType)
                {
                    case XmlNodeType.Element:
                        if (xml.Name == "product")
                        {
                            // using XmlDocument is ok here since we know
                            // a product is not too big
                            // but we could continue with the reader too
                            var product = new XmlDocument();
                            product.LoadXml(xml.ReadOuterXml());
                            Console.WriteLine(count++);
                        }
                        break;
                }
            }
        }
    }
}

PS: Ideally, you could use async / await code with Async counterparts methods ReadInnerXmlAsync / ReadOuterXmlAsync but this is another story and easy to setup.