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.
tüm verileri almak ve RAM 300MB yaklaşık ocuppies bir
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.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.
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-
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:
Üçü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?
Ç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 –
@ 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
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