PHP ile sorunlar büyük dizi oluşturmak için çalışırken

3 Cevap php

İşte benim kod sıfır ile doldurulması 2d dizi oluşturur hangi, dizi boyutları (795,6942) şunlardır:

function zeros($rowCount, $colCount){
    $matrix = array();
    for ($rowIndx=0; $rowIndx<$rowCount; $rowIndx++){
        $matrix[] = array();
        for($colIndx=0; $colIndx<$colCount; $colIndx++){
            $matrix[$rowIndx][$colIndx]=0;
        }
    }
    return $matrix;
}

$matrix = zeros(795,6942);

Ve burada aldığınız hatadır:

Allowed memory size of 134217728 bytes exhausted (tried to allocate 35 bytes)

Bu çözmek için nasıl bir fikir?

3 Cevap

Hızlı bir hesaplama olarak, içeren bir dizi oluşturmak için çalışıyoruz:

795*6942 = 5,518,890

tamsayılardır.

Biz bir tamsayı 4 bayt (i.e. 32 bits ; using PHP, it not be less) saklanır olduğunu düşünürsek, bu şu anlama gelir:

5518890*4 = 22,075,560

bayt.

Tamam, hızlı hesaplama ... sonuç "it should be OK" dir.

But things are not that easy, unfortunatly :-(
I suppose it's related to the fact that data is stored by PHP using an internal data-structure that's much more complicated than a plain 32 bits integer


Now, just to be curious, let's modify your function so it outputs how much memory is used at the end of each one of the outer for-loop :

function zeros($rowCount, $colCount){
    $matrix = array();
    for ($rowIndx=0; $rowIndx<$rowCount; $rowIndx++){
        $matrix[] = array();
        for($colIndx=0; $colIndx<$colCount; $colIndx++){
            $matrix[$rowIndx][$colIndx]=0;
        }
        var_dump(memory_get_usage());
    }
    return $matrix;
}

Bu, ben (PHP 5.3.2-dev on a 64bits system ; memory_limit için 128MB ayarlandığında çıktı bu tür alıyorum - zaten bir sürü) !:

int 1631968
int 2641888
int 3651808
...
...
int 132924168
int 133934088
Fatal error: Allowed memory size of 134217728 bytes exhausted

Dış her tekrarında anlamına gelir for-döngü bellek 1.5 MB gibi bir şey gerektirir - ve komut bellek dolmadan sadece 131 yineleme için olsun; ve senin gibi 765 istedim.

Gibi - Eğer memory_limit 128M, gerçekten çok daha yüksek bir şey ayarlamak gerekiyor ayarlanır göz önüne alındığında

128*(765/131) = 747 MB

Peki, bile

ini_set('memory_limit', '750M');

800MB, yeterli görünüyor ile o ... hala yeterli değil ;-)


But I would definitly not recommend setting memory_limit to such a high value !

(If you have 2GB of RAM, your server will not be able to handle more than 2 concurrent users ^^ ;; I wouldn't actually test this if my computer had 2GB of RAM, to be honest)


The only solution I see here is for you to re-think your design : there has to be something else you can do than use this portion of code :-)

(BTW : maybe "re-think your design" means using another language PHP : PHP is great when it comes to developping web-sites, but is not suited to every kind of problem)

Varsayılan PHP dizi uygulama bellek kullanımı çok yoğun olduğunu. Sadece tamsayıları (ve onları bir sürü) depolama iseniz, muhtemelen SplFixedArray bakmak istiyorum. Geleneksel karma yapısına karşıt olarak, veri depolamak için düzenli bir bitişik bellek bloğu kullanır.

PHP için kullanılabilir bellek miktarını artırarak denemelisiniz:

ini_set('memory_limit', '32M');

PHP dosyası.