c# ile yapmak için kısa bir kod yazmıştım zamanında , az değiştirdim. buna benzer şekilde parçalayabilirsiniz.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace SADtest
{
    class Program
    {
        const string kaynakDosya = "C:denemebig.xml";
        const string dizinHedef = "C:deneme";
        const int dosyaBytes = 5242880; // 5 MB
        const int sinirBytes = 10485760; // 10 MB
        static int dosyaID = 0;
        static StringBuilder sb = new StringBuilder();

        static void Main(string[] args)
        {
            xmlParcala();
        }

        static void xmlParcala()
        {
            if (!File.Exists(kaynakDosya))
            {
                throw new FileNotFoundException($"{kaynakDosya} dosyası yok!");
            }

            using (StreamReader sr = new StreamReader(kaynakDosya, Encoding.UTF8))
            {
                while (!sr.EndOfStream)
                {
                    // her seferinde 1 satır oku
                    string satir = sr.ReadLine();
                    if (string.IsNullOrEmpty(satir))
                    {
                        continue;
                    }

                    // yazılacak dosya 5 mb olana kadar doldur
                    sb.AppendLine(satir);

                    // dosya 5 mb eşiğine ulaşır veya geçerse
                    if (sb.Length >= dosyaBytes)
                    {
                        // 5 mb oldu artık dosyayı kayıt edebiliriz.
                        // burda xml olduğu için çeşitli node kontrolleri yapılması gerekebilir.
                        // çünkü kesmenin doğru yerden yapılması gerekir.
                        // örneğe göre bu satırda aradığımız node şu şekilde bitiyorsa dosyayı kayıt edecek.
                        if (satir.EndsWith("</bitisnodesi>", StringComparison.Ordinal))
                        {
                            // 5 mb lık dosyayı yaz.
                            xmlYaz();
                        }
                        else if (sb.Length >= sinirBytes)
                        {
                            // 5mb oldu ancak bizim aradığımı kesilecek node henüz bulunamadı.
                            // döngü sürdükçe tampona atmaya devam edecek bu da tamponu büyütecek
                            // bunun önüne geçmek için sinirBytes ile 10 mb sınır verdik.
                            // burda dilerseniz bir Exception fırlatarak işlemi kesebilirsiniz.
                            throw new Exception("Max. sınıra ulaşıldı ancak node hala yok!");
                        }
                    }
                }

                // tamponda kalan varsa ayrı bir dosyaya yaz
                if (sb.Length > 0)
                {
                    // 5 mb lık dosyayı yaz.
                    xmlYaz();
                }
            }
        }

        static void xmlYaz()
        {
            // eşsiz bir xml dosyası yazılacak ve tampon sıfırlanacak.
            dosyaID++;
            string fullPath = $"{dizinHedef}{dosyaID}.xml";
            File.WriteAllText(fullPath, sb.ToString());
            sb = new StringBuilder();
        }
    }
}