none
64 bit program hafızası RRS feed

  • Soru

  • Arkadaşlar kolay gelsin. Bi programım iş gereği çok fazla ram miktarına ihtiyaç duymaktadır. Program 64 bit işletim sisteminde çalışmakta ve 64 bit yapısı gereği programa kısıtlı ram miktarı atamaktadır. Programın kullanabileceği ram miktarını arttırma yöntemi nasıl yapılır?
    24 Kasım 2015 Salı 08:30

Yanıtlar

  • Bir uygulamanın ram sınırı diye bişey yoktur (uygulama kendi kendini sınırlamadıysa), hele 64/32 bit ile hiç ilgisi yok.

    Sanırım senin sonurum CLR object size limiti, .Net'te default olarak bir class instance'ı 2GB'ı aşamıyor. 

    Çözüm için İki durum sözkonusu:

    1. oluşturduğun bir instance çok büyüyorsa, App.Config de gcAllowVeryLargeObjects 'i true yapabilirsin. 

    2. bu projeye özgü olarak toplu aktarım işlemlerinizi SqlBulkCopy ve SqlReader ile yapman.

    Not: Bu arada hani milletin veri çekmek için while ile kulandığı SqlReader varya esas görevi burasıdır işte.


    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com


    24 Kasım 2015 Salı 09:20
    Moderatör

Tüm Yanıtlar

  • Deleted
    24 Kasım 2015 Salı 08:44
  • "64 bit yapısı gereği programa kısıtlı ram miktarı atamaktadır." bu ne demek?

    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    24 Kasım 2015 Salı 08:44
    Moderatör
  • Normalde kullanacağı bellek program için 1 gb atamış yani ayrılan bellek miktarı 1gb olarak gözüküyor. Ancak sistem 32 gb ve kullanılmayan bellek miktarı 24 gb civarında. Program bi işlem için bi veri tabanına toplu kayıt aktarıyor. Ancak bir müddet sonra out of memory hatası veriyor. Programa ayrılmış olan ram miktarını nasıl yükseltebilirim.
    24 Kasım 2015 Salı 08:53
  • Bir uygulamanın ram sınırı diye bişey yoktur (uygulama kendi kendini sınırlamadıysa), hele 64/32 bit ile hiç ilgisi yok.

    Sanırım senin sonurum CLR object size limiti, .Net'te default olarak bir class instance'ı 2GB'ı aşamıyor. 

    Çözüm için İki durum sözkonusu:

    1. oluşturduğun bir instance çok büyüyorsa, App.Config de gcAllowVeryLargeObjects 'i true yapabilirsin. 

    2. bu projeye özgü olarak toplu aktarım işlemlerinizi SqlBulkCopy ve SqlReader ile yapman.

    Not: Bu arada hani milletin veri çekmek için while ile kulandığı SqlReader varya esas görevi burasıdır işte.


    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com


    24 Kasım 2015 Salı 09:20
    Moderatör
  • Önay hocam aktarımımı SqlBulkCopy ile yapıyorum. Başta 700000 satırlık bir data ekleme işlem yapmaya kalktım ama hata verdi. sonra 100000 satırlık aktarımlar yapmaya çalışıyorum. Sistem hata vermedi ancak çok yoruyor sanki. Bilgisayarda program için ayrılan ram alanı ile kullanılan ram alanı arasında 4-5 mb var ve zorluyor.  SqlBulkCopy bu kadar yorucu olabilir mi?
    24 Kasım 2015 Salı 09:26
  • Olabilir, bende 1.9 milyonluk bir tablo aktarırken OutOfMemory exception almıştım, ama SqlBulkCopy'nin parça parça atma özelliğini yani  BatchSize ını 2000 yapmıştım, ayrıca veriyi komple okuyup değilde, ExecuteReader ile reader i SqlBulkCopy e vermiltim 1o numara çalışmıştı.

    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    24 Kasım 2015 Salı 09:36
    Moderatör
  • Olabilir, bende 1.9 milyonluk bir tablo aktarırken OutOfMemory exception almıştım, ama SqlBulkCopy'nin parça parça atma özelliğini yani  BatchSize ını 2000 yapmıştım, ayrıca veriyi komple okuyup değilde, ExecuteReader ile reader i SqlBulkCopy e vermiltim 1o numara çalışmıştı.

    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    Böyle bir şeye neden ihtiyaç duydunuz abi? Senaryo neydi? Backup, Replication vs yerine mi tercih ettiniz?

    Mail Blog Web Site

    24 Kasım 2015 Salı 09:40

  • Böyle bir şeye neden ihtiyaç duydunuz abi? Senaryo neydi? Backup, Replication vs yerine mi tercih ettiniz?

    Mail Blog Web Site

    Açık yaraya parmak bastın :)
    Senaryoyu anlatmayım şimdi ama yazılımcının sql'e tecavüz ettiğ bir flim çıkar bu senaryodan onu söyleyebilirim. Biliyosun öyle yazılımcılar var ki ülkede, kişinin çocukları bilgisini ayrı tabloda tutmak yerine tabloda bir alana 12-k-9-e şeklinde nvarchar kaydetmiş adam. 12 yaşında kız 9 yaşında erkek çocuğu varmış. Adamın database yaklaşımı bu, hadi bunu geçtik bu kişinin çocukları sonsuza dek 12 ve 9 yaşında mı kalacak?

    Neyse böyle aptal bir database'i ilişkili tabloları olan bir database e taşımak için kullanmıştım. :)


    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    24 Kasım 2015 Salı 09:48
    Moderatör
  • Valla benim işim daha iyiymiş. Ben gelen bir fiyat dosya txt sini okuyup 700000 ürünün fiyat tablosunu içeri 100000 olarak aktarmaya çalışıyorum. Okuduğum satırları bir datatable içerinine aktarıp SqlBlkCopy ile database deki taplonun kolonlarına referans ettim. BatchSize değerini 5000 verdim. Ama hala bekliyorum.  Satır başına ortalama 3 kayıttan toplamda  300000 satırlık bir kayıt bulunmakta. Bakalım sonumuz hayırlı olsun.
    24 Kasım 2015 Salı 09:58

  • Böyle bir şeye neden ihtiyaç duydunuz abi? Senaryo neydi? Backup, Replication vs yerine mi tercih ettiniz?

    Mail Blog Web Site

    Açık yaraya parmak bastın :)
    Senaryoyu anlatmayım şimdi ama yazılımcının sql'e tecavüz ettiğ bir flim çıkar bu senaryodan onu söyleyebilirim. Biliyosun öyle yazılımcılar var ki ülkede, kişinin çocukları bilgisini ayrı tabloda tutmak yerine tabloda bir alana 12-k-9-e şeklinde nvarchar kaydetmiş adam. 12 yaşında kız 9 yaşında erkek çocuğu varmış. Adamın database yaklaşımı bu, hadi bunu geçtik bu kişinin çocukları sonsuza dek 12 ve 9 yaşında mı kalacak?

    Neyse böyle aptal bir database'i ilişkili tabloları olan bir database e taşımak için kullanmıştım. :)


    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    :) Şimdi oldu. Benimde yıllık olarak güncellemem gereken bir program var. İnşallah yeni bişeyler istemezler diye dua ediyorum. Tek bir sınıfta herşeyi yapmış. OOP=sınıf. Bir sınıf ile OOP yapmış. Yada yapılır diye düşünmüş. Koca bir proje bu sınıfa bağlı. Bir silsem proje çöp.

    Mail Blog Web Site

    24 Kasım 2015 Salı 10:11
  • Eğer isteyen olursa şöyle bir kaynak buldum. .net framework 4.5 ve .net framework 4.6 versiyonlarında çalışan bir kod.

    Microsoft Documentation
    • Düzenleyen facia026 24 Kasım 2015 Salı 10:28
    24 Kasım 2015 Salı 10:26
  • Ben mi yanlis okuyorum, yoksa sen mi sifirlari eksik yazdin? 700 bin diye okuyorum, 700 ya da 70 milyon mu yazmak istedin aslinda? Eger ben dogru okuyorsam, oyle 700 bin, 1-2 milyon gibi rakamlar icin MS SQL server'a SqlBulkCopy aktarimlari hic de sikayet edilecek turden degil. Tamam cok hizli degil ama ornegin 10-15 alanli 1.5 milyon kayit icin de 30-40 sn gibi ortalama degeri var, bence internete girip sen bunlari yazmayi bitiremeden biten bir is icin cok da sikayet etmemek lazim. Bu yavas geliyorsa, dil olarak farkli diller deneyebilirsin. Mesela ben postgreSQL'e Go kullanarak, ortalama 16-18 sn'de 1 milyon kayit yazabiliyorum (ki bu bulk bile degil). 

    Arada bir DataTable lafi etmissin. Sanirim hata burada. DataTable, DataSet bunlar daha ilk ortaya cikislarindan beri hantal yapilar.  SqlBulkCopy'de kaynagi bir DataReader'a bagla. 

    24 Kasım 2015 Salı 11:24
    Yanıtlayıcı
  • Veri kaynağım bir txt dosyası ve bu dosyadan okuyup gelen verileri işleyip datatable nesnesine aktarıyorum. Buradan SqlBulkCopy nesnesine aktarıp işlem yapıyorum
    24 Kasım 2015 Salı 12:19
  • Text dosyasindan dogrudan okutup serverda isletebilirsin. Ya da text dosyasindan alip isledigini yine text dosyasina yazdirip dogrudan oradan okutabilirsin. Datatable kullaniyorsan, problem o, SqlBulkCopy filan degil.

    Bu arada, SQLExpress kullaniyorsan, 1 Gb RAM siniri var.

    24 Kasım 2015 Salı 12:25
    Yanıtlayıcı
  • Text dosyasından okutup serverda nasıl işletebileceğim ki. Serverdan kastınız sql mi?
    24 Kasım 2015 Salı 12:26
  • Evet, SQL server'in da T-SQL diye bir dili var. Ya da .Net kodu kullanmak istersen CLR destegi var, C# ile Function, Stored Procedure, User Type yazabilirsin. Ayni zamanda table parameter de kabul ediyor.

    Not:  SQL CLR ornegi

    24 Kasım 2015 Salı 12:29
    Yanıtlayıcı