01-26-2017 12:09 AM
Yazılımdan "not enough memory to complete this operation" hatasını alıyorum. Bu hatanın olası sebebleri neler olabilir. İnternette genel bir çözüme rastlamadım. Uzun süreli çalışan bir yazılım ancak 2GB Ram Windows7 bilgisayar özellikleri. Aynı zamanda yazılımda DLL de kullanıyorum. Ancak bu hata labview den diye düşünüyorum. Yardımcı olabilir misiniz ?
http://forums.ni.com/t5/LabVIEW/not-enough-memory-to-complete-this-operation/m-p/3069312
Yukarıdaki linkte oluşan ekran görüntüsü var.
01-26-2017 12:17 AM - edited 01-26-2017 12:18 AM
Merhabalar Serkan Bey,
Yazılımınızda muhtemelem kümülatif olarak artan bir memory kullanımı var. Bunun birçok sebebi olabilir. Örneğin bir buffer mekanizmanız varsa( Queue etc.) bunu consume eden kısım yavaş kalıp zamanla birikme olacaktır. Bir diğeri çok büyük array'ler ile işlem yaparken dikkatli olmanız gerekir, tamamı üzerinde işlem yapmak yerine parçalayarak işlem yapmak ram kullanımını düşürecektir. Bir diğeride açmış olduğunuz kaynakların/referansların close/dispose edilmemesidir.Hata yüksek ihtimal labview'den değil kodun optimize olmamasındandır. Şüphelendiğiniz bir kod parçası varsa benimle özelden paylaşırsanız sizlere daha fazla yardımcı olabilirim.
Saygılarımla...
01-26-2017 12:56 AM
Merhaba Himmet Bey,
Verdiğiniz olası sebepler üzerinden gideceğim. Ve hatayı tekrarlamaya çalışacağım. Hatanın yerini bulunca burdan paylaşırım.
İyi çalışmalar,
01-26-2017 01:13 AM - edited 01-26-2017 01:22 AM
Himmet Bey'in söylediklerinin tamamı olabilir. Özellikle ise şuna dikkat edin;
"Initialize Array" kullandığınız bir yer varsa ve boyutunu dinamik ayarlıyorsanız muhtemelen boyutu beklenmedik bir değer alıyor ve oluşturmaya çalıştığınız dizi RAM sınırlarını aşacak kadar büyük oluyor. Eğer durum buysa ya hata oluştuğunda böyle bir dizi oluşmasını engelleyin (Error Case kullanarak) yada dizi boyutu için gelen değere sınırlandırma yapın ("Max & Min" kullanarak hızlıca yapabilirsiniz).
Diğer yüksek olasılık ise sürekli ekleme yaptığınız ancak boyutunu sınırlandırmadığınız diziler olabilir. "Build Array" yada "Insert Into Array" kullandığınız yerleri kontrol edin. Bu sorun belirttiğiniz hatanın çıkmasından önce yazılımda yavaşlamalara sebep olacaktır. Hata böyle bir yerde ise ya sabit boyutlu dizi kullanıp içeriği indekslerle takip edin yada nihai diziyi belli boyuta erişecek şekilde sınırlandırın. Bunun için "Delete From Array" yada "Split Array" kullanabilirsiniz.
"Queue" kullanıyorsanız ve hata bunun üzerinde oluşuyorsa muhtemelen eklediğiniz veri çok büyük boyutludur. Genelde resim gibi verileri "metin" yada "xml" e açarak yolladığınızda olabilir. Ama bu hatanın oluşması için yollayacağınız verinin boyutu gerçekten çok büyük olmalıdır. Bundan önce yazılımda yavaşlama hissetmeniz daha muhtemeldir. Hata bundan kaynaklanıyorsa veriyi metne açarak değil de "dvr (data value reference)" üzerinden dağıtmanız daha doğru olacaktır.
Tahminim ilk olasılık 🙂
01-26-2017 07:21 AM
Zafer Bey, RAM ile ilgili sorunları çok fazla yaşıyorum. Optimum çözüme ulaşmakta sıkıntı yaşıyorum. "Queue" kullanmıyorum. 2D array 20-30 tane ölçümü saniye de bir biriktiriyor. 4 gün sonra falan hata geliyor. Array init state de sadece ilk çalışırken reinit yapılıyor. C# da kullanılan Garbace Collector tarzı birşeye ihtiyacım olabilir (0 ms wait bu işe yarıyor sanırım, emin de değilim.). dll de kullanılan try catch blogundan sürekli hata gelmesi de sorun olabilir mi acaba diye düşünüyorum. Hatayı analiz edemedim henüz. Detaylı açıklamalar için teşekkür ederim. Yardımcı olacağını düşünüyorum.
01-26-2017 08:45 AM
01-26-2017 08:56 AM
Evet sürekli ucuna ekliyor. Şimdilik bir kısıtlama yok yazılımda. Yapılmalı öı ? Yapılmalıysa kararını nasıl vermeliyim ? Grafik ekranında günlerce kayıt edilen dataların gösterilmesi gerekiyor.
01-26-2017 09:00 AM
"2D array 20-30 tane ölçümü saniye de bir biriktiriyor. 4 gün sonra falan hata geliyor."
Himmet Bey'in de belirttiği gibi sorun muhtemelen burada. Labview'de DVR (data value reference) ya da .NET kullanmıyorsanız "garbage collector/dispose" türünden birşey kullanmanız gerekmez. Yapmanız gereken verileri dizide değil dosyada tutmak. Dizi içeriğini belli aralıklarla dosyaya yazın ve dizi içeriğini boşaltın.
Kodu eklerseniz nereye müdahale edeceğinizi gösterebiliriz.
01-26-2017 11:05 AM
Merhabalar,
Verileri devamlı bir dosyaya kaydedin. Grafiğin gösterebileceği maksimum point size'ı belirleyin (50000 mesela). Dosyada şu ana kadar kaç adet veri olduğunu bulup, maksimum 50000 data olacak şekilde decimation yaparak(atlayarak) verilerinizi grafiğe aktarabilirsiniz. Örneğin 1. gün sonunda 40000 datanız var bunu direk grafiğe verebilirsiniz,fakat bir süre sonra veri sayınız 100000 oldu, dosyadan 2şer atlayarak verilerinizi okuyup grafiğe çizdirin.
Saygılarımla...
01-27-2017 12:14 AM
Merhaba Himmet Bey, Zafer Bey,
2-3 saat gibi aralıklarla kayıt alıyorum. Dosyalama sistemi var. Birden fazla dosya tutuluyor. Ancak dediğiniz gibi tüm datayı grafiğe aktarmak adına 2D arrayi ilk andan sonra hiç reinit yapmıyorum. Array kayıt aldıkça temizlenip ekrana kayıt alınan dosyadan okunan data grafik edilebilir. Anlattılanlar bunu anladım. Kodu basitleştirip örnek bir uygulama koyarım, vakit ayırabilirsem. Sizde anlattıklarınıza uygun temel bir example varsa paylaşırsanız sevinirim.
İyi çalışmalar