• 24-09-2019, 23:11:34
    #1
    merhaba arkadaşlar elimde 500 mb boyutunda bir XML dosyası var bunu küçük parçalara bölmem lazım nasıl yapabilrim daha önce yapan oldu mu ?

    Phyton ile yapanlar var ama Phyton bilgim hiç yok konu hakkında bilgisi olan var mı acaba ?
  • 25-09-2019, 14:28:26
    #2
    Orgeneral adlı üyeden alıntı: mesajı görüntüle
    merhaba arkadaşlar elimde 500 mb boyutunda bir XML dosyası var bunu küçük parçalara bölmem lazım nasıl yapabilrim daha önce yapan oldu mu ?

    Phyton ile yapanlar var ama Phyton bilgim hiç yok konu hakkında bilgisi olan var mı acaba ?
    Golang'le cok hizli bi sekilde parse edip chunklayip dosya olarak olusturabilirsiniz. Parse islemi icin ornek;
    https://jm33.me/parsing-large-xml-with-go.html
  • 25-09-2019, 14:32:30
    #3
    https://stackoverflow.com/questions/...llers-with-php

    Bu adreste bir kaç farklı yoldan bahsedilmiş hocam.
  • 29-09-2019, 20:28:31
    #4
    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();
            }
        }
    }