2015-04-29 38 views
5

Bir ERP'nin SQL Server veritabanı tarafından sağlanan bilgileri kullanan karmaşık bir uygulama yapıyorum (planlama şunları içerir: makaleler, satışlar, müşteriler, üretim, makineler ...) .Büyük bir veri kümesini C# nesnelerine dönüştürme

Her birinde bilgileri bir tablo/görünümde saklanan yaklaşık 30 farklı ilgili nesne kullanıyorum. Bu tabloların bazıları 20k ila 100k kayıtlara sahiptir.

Tüm bu tabloları, SQL'de işlenemeyen gelecekteki işlemler için C# nesnesine dönüştürmem gerekiyor. Tüm satırlara ihtiyacım yok, ancak çalışma zamanı olaylarına bağlı olacağından hangilerinin tam olarak hangisine ihtiyacım olduğunu belirlemenin bir yolu yok.

Soru, bunu yapmanın en iyi yolu hakkındadır.

  1. tüm verileri almak ve RAM 300MB yaklaşık ocuppies bir SqlDataAdapter kullanan bir DataSet'te saklayın: Aşağıdaki yaklaşımlar çalıştılar. İlk sorun burada: senkronizasyon, ancak veriler, yürütme sırasında bu kadar değişiklik yapmak için gitmediğinden kabul edilebilir.

    Sonra aracılığıyla her satır koştu ve onu C# tuşu ile hızlı erişim için statik Sözlükler saklanan, nesneleri dönüştürmek. Bununla ilgili olarak, çok fazla nesne (milyonlarca) oluşturmanın, bellek kullanımını 1,4GB'a kadar çıkarması çok fazladır. Bellekten başka, erişim çok hızlıdır.

nedenle tüm almak çok fazla bellek alırsa, ben laxy yükleme çeşit ihtiyacı olduğunu düşündüm, bu yüzden denedim:

ben kabul var başka seçenek
    1. ile( sadece sadece ilk kez gereksinim duyduğum öğeye göre süzme) veritabanı, doğrudan sözlüğünde saklanır. Bu şekilde bellek kullanımı minimumdur, ancak bu şekilde yavaştır (dakika sıralaması), sunucunun beğenmediği farklı sorgularda (düşük performans) olması gerektiği anlamına gelir.

    Son olarak, bir ara yaklaşım işlerin bu tür denedik, ama optimum olmazsa, o değil şüpheli emin değilim:

    1. Üçüncü bir seçenek Yani

      public class ProductoTerminado : Articulo  { 
      
          private static Dictionary<string, ProductoTerminado> productosTerminados = new Dictionary<string, ProductoTerminado>(); 
      
          public PinturaTipo pinturaTipo { get; set; } 
          public ProductoTerminado(string id) 
           : base(id) { } 
          public static ProductoTerminado Obtener(string idArticulo) 
          { 
           idArticulo = idArticulo.ToUpper(); 
           if (productosTerminados.ContainsKey(idArticulo)) 
           { 
           return productosTerminados[idArticulo]; 
           } 
           else 
           { 
            ProductoTerminado productoTerminado = new ProductoTerminado(idArticulo); 
            //This is where I get new data from that static dataset 
            var fila = Datos.bd.Tables["articulos"].Select("IdArticulo = '" + idArticulo + "'").First(); 
            //Then I fill the object and add it to the dictionary. 
            productoTerminado.descripcion = fila["Descripcion"].ToString(); 
            productoTerminado.paletizacion = Convert.ToInt32(fila["CantidadBulto"]); 
            productoTerminado.pinturaTipo = PinturaTipo.Obtener(fila["PT"].ToString()); 
            productosTerminados.Add(idArticulo, productoTerminado); 
            return productoTerminado; 
           } 
          } 
      } 
      

    : tüm bilgileri içeren bir DataSet doldurmak ve yerel bir statik kopyasını saklamak, ancak nesnelere tüm satırları dönüştürmez olacaktır, sadece, istek üzerine (tembel) üzerine böyle bir şey yapmak , Bu, devam etmek için iyi bir yol mu yoksa Entity Framework'e mi yoksa güçlü bir şekilde yazılan bir DataSet mu?

  • +1

    Çok fazla veriye sahipseniz, belki de uygulamanızın içinde bir yerel bellek veritabanı oluşturmaya çalışmak yerine veritabanında (seçenek 2) bırakmanız gerekir. Uygulamanız kesinlikle başladığında, kullanıcının doğrudan 1.4Gb'lik verileri görmesi gerekmez. Uygulamanızın birincil veri farkında ekranında neler var? Hiç kimse bir ızgarada 1.4G veriyi anlamlandıramaz. Genellikle ilk önce onu analiz etmeliler. Belki daha fazla –

    +0

    @ Nick.McDermaid expalin olabilir Bu veri bir şekilde SQL (geçici simülasyon, sezgisel algoritma), bu işlemin bir sonucu ile yapamaz şekilde işleyemez bir şekilde işlemek ve almak gerekir Veritabanından gelen bilgiler çeşitli ekranlarda kullanıcıya gösterilmektedir. – Pinx0

    +2

    Uygulamanızın nasıl kullanılacağını söylemezsiniz, aynı anda verilere erişen çok kişi var mı, yoksa sadece bir iki mi var? Uygulama, veritabanınızın bulunduğu yerden veya aynı ağdan uzaktan kullanılıyor mu? Seçenek 2'de "program SLOW" yazıyor, ancak bununla ne demek istediğinizi ölçebilir misiniz? Sorgular saniye, dakika alıyor mu? Ek bilgi olmadan tavsiye etmek zordur. – Tony

    cevap

    1

    Her biri bir tablo/görünümde depolanan yaklaşık 30 farklı nesne arasındaki ilişkileri kullanırım. Bu tabloların bazıları 20k ila 100k kayıtlara sahiptir.

    Farklı nesne türleri için farklı bir karar vermenizi öneririm. Genellikle, binlerce kaydı olan tabloların değişme olasılığı daha yüksektir. Daha az kayıt olan tablolar daha az olasıdır. Bir proje üzerinde çalıştığım bir kararda, List<T> numaralı telefonun içinde değişiklik yapmayan (başlatma sırasında) nesneleri önbelleğe almaktı. Birkaç yüz örnek için bu, bir saniyeden daha kısa sürmelidir.

    LINQ-SQL kullanarak, sen obj 'in kimliği tarafından filtre öğeler tablosuna erişim için obj.Items yapabilir bir List<T> yerel bir nesne vardır ve doğru olarak FK kısıtlamaları tanımlanmıştır. (Bu örnekte, PK, Öğeler FK tablosudur).

    Bu tasarım, kullanıcılara bekledikleri performansı da verecek. Küçük kümeler üzerinde çalışırken, her şey anında (önbelleğe alınır). Daha büyük kümeler üzerinde çalışırken, ancak küçük seçimler veya ekler oluştururken performans iyidir (PK'yi kullanan hızlı sorgular). Birden çok büyük tabloya katılan sorguları yapmaya başladığınızda sadece gerçekten acı çekiyorsunuz; ve bu gibi durumlarda, kullanıcılar muhtemelen bunu bekleyecektir (ancak kullanım durumu hakkında daha fazla bilgi sahibi olmadan emin olamıyorum).

    İlgili konular