2009-08-11 3 views
10

MATLAB’da yeniyim, iş tanımında değildim ve şirketimin kullandığı kodu yazıp muhafaza eden kişiyi devralmaya zorlandım. Hayat zor. MATLAB'de, değişkenler olarak iletmek yerine global değişkenler bildirerek belleği korur muyum?

ben devralıyorum hangi adam

o bellekten tasarruf etmek, global gibi tüm büyük veri vektörleri ilan söyledi. Daha spesifik olarak, bir işlev başka bir işlevi çağırdığında, veriyi geçtiğinde bir kopyasını oluşturmaz.

Bu doğru mu? Ben Strategies for Efficient Use of Memory okumak ve büyük veri kümeleri ile çalışırken denilen fonksiyon değerini değiştirmesi durumunda MATLAB bir giriş değişkeninin geçici bir kopyasını yapar

, farkında söylüyor. Bu, diziyi saklamak için gereken belleği geçici olarak ikiye katlar ve bu da yeterli bellek yoksa MATLAB'ın bir hata üretmesine neden olur.

Bir işleve bir değişken geçmek

, aslında değişken temsil verilere başvuru geçiyoruz:

O Memory Allocation For Array #Function Arguments içinde çok benzer bir şey söylüyor. Giriş verileri çağrılan işlev tarafından değiştirilmediği sürece, çağrılan işlevdeki değişken ve çağrılan işlevdeki değişken bellekte aynı konuma işaret eder. Çağrılan işlev giriş verilerinin değerini değiştirirse, MATLAB orijinal dizinin bir kopyasını bellekte yeni bir konuma getirir, değiştirilen değerle kopyayı günceller ve çağrılan işlevdeki giriş değişkenini bu yeni diziye işaret eder.

global'un kullanılması daha iyi olabilir mi? Kodun hiçbiri giriş argümanını değiştirmediğinden emin olmak yerine, tüm büyük verileri global olarak belirtmek için biraz özensiz görünüyor. Yanlış mıyım? Bu gerçekten RAM kullanımını artırıyor mu? Tecrübelerime göre

+2

Neyin daha iyi olduğunu görmek için RAM kullanımını izlemiyorsunuz? Sorunun diğer performanslardan farklı olduğunu düşünmüyorum. Kodunuzu izlemeniz gerekiyor. İki döngüyü yazıp sanki bir global olarak veya bir işlevin girdisi olarak bir değişkenin kodunuzun girdi verilerini değiştirdiğinde daha iyi olduğunu test edersiniz (eğer bunu yaparsa, bellek sadece “iki katına çıktı”). Cevabını verdiğim için üzgünüm, ama performans önemli olduğunda çok fazla hata var. – inerte

+0

Kesinlikle doğru, ama yine de soruyu sordum, çünkü bunun sadece hafıza değil, kodlama tarzı olduğu konusunda endişeliydim. Oh iyi ... – scraimer

+2

Yardımcı olabilecek birkaç şey var: "profile on -memory" Matlab profilindeki tahsisi takip edecektir. Ve R2008a + kullanıyorsanız, yeni stil "tutamaç" nesneleri, bellekten tasarruf edecek ancak globals'tan daha iyi bir kapsam kontrolüne sahip olan referansa göre geçiş yapabilir. –

cevap

6

, bellek kullanımı Matlab dokümanlar yazdığı gibi, bağımsız bir global değişken veya bir giriş argüman kullanmak olsun, aynıdır, kod hiçbiri büyük veri değiştirir şartıyla. Daha fazla bilgi, bir MathWorks çalışanı tarafından bu blog post numaralı makaledir. Oldukça Matlabda performans sorunlarına ilişkin Folklorun bit ve hepsini değil bulunmaktadır

haklı. Matlab'ın içi oldukça değişti. Bir önceki versiyonda global değişken kullanmak daha iyi olabilir.

+1

+1 ve Loren'in blogunu kullanabilmeniz için serinlik için cevap verin. O burada bir kullanıcı! - http://stackoverflow.com/users/113700/loren – scraimer

2

çözüm bana biraz garip geliyor. Daha önce de belirttiğiniz gibi, çağrılan işlev veri dizisini değiştirmezse, bellek kullanımı üzerinde önemli bir etkisi olmamalıdır. adı işlev veri dizisi değiştirir, ancak, bir işlevsel fark vardır: Bir durumda (hale global veri dizisi), değişim, diğer durumda kodunun geri kalanı üzerinde bir etkisi vardır (referans olarak geçen) değişiklikler sadece yerel ve geçici.

4

Bu yanıt biraz teğet olabilir, ancak burada sözü edilen ek bir konu, belleği yönetmek için nested functions kullanımıdır.

Diğer yanıtlarda daha önce de belirtildiği gibi, işleve ilettiğiniz veriler değiştirilmediğinde (başvuruyla iletileceğinden) global değişkenine gerek yoktur. , değiştirilmişse (ve bu nedenle değere göre geçirilir), bunun yerine bir global değişkenini kullanarak belleği kaydeder. Ancak, global değişkenler aşağıdaki nedenlerle biraz "kaba" olabilir:

  • Sen onlara ihtiyaç her yerde global varName gibi bir deklarasyon yapmak zorunda.
  • Özellikle birden çok m-dosyasına yayıldıklarında, ne zaman ve nasıl değiştirildiklerini izlemek için biraz dağınık olabilir.
  • kullanıcı kolayca bir tüm küresel değişkenleri temizler, hangi clear global hasta yerleştirilir ile kodunu bozabilir. İç içe işlevler:

global değişkenlere bir alternatif the first set of documentation you cited belirtilmiştir. Hemen bir kod (Ben biraz farklı burada biçimlendirilmiş ettik) örnek size gösterdi alıntı aşağıdadır: Bu örnekte

function myfun 

    A = magic(500); 
    setrowval(400, 0); 
    disp('The new value of A(399:401,1:10) is') 
    A(399:401,1:10) 

    function setrowval(row, value) 
    A(row,:) = value; 
    end 

end 

, fonksiyon setrowval fonksiyonu myfuniç içe olduğunu. myfun çalışma alanındaki A değişkenine setrowval içinde erişilebilir (her birinde global bildirilmiş gibi). Yuvalanmış işlev, bu paylaşılan değişkeni değiştirir ve böylece ek bellek ayırmalarını önler. Kullanıcıyı yanlışlıkla bir şeyleri temizlemek için endişelenmenize gerek yok ve (bana göre), global değişkenlerini bildirmekten çok daha temiz ve daha kolay takip edilebilir.