SORU
24 Ocak 2014, Cuma


Dizi gibi bir az bellek kullanımı ile PHP bir yapıya ihtiyacım var

Benim PHP komut ^ dizisi oluşturmak istiyorum . 600 k tamsayı. Ne yazık ki benim web sunucuları memory_limit dizi başlatırken yani 32 MİLYON ayarlanır ileti ile komut iptal eder

Ölümcül hata:33554432 bayt (71 bayt ayırmaya çalıştı) bitkin bellek boyutu izin verdi/home/www/myaccount/html/mem_test.phphat üzerinde8

Ben farkındayım aslında, bu PHP için dizi değerleri olarak düz tamsayılar ziyade zvalues olan çok daha büyük, daha düz bir tamsayı değeri (8 bytes benim 64-bit sistem). Tam olarak 128 bayt oldukça ne kadar her dizi girişi kullanır ve çıktı tahmin etmek için küçük bir script yazdım. 128!!! ^ İhtiyacım var . Sadece depolama dizisi 73. Ne yazık ki web sunucusu memory_limit artış veremem benim kontrolüm altında değil.

Benim sorum, orada PHP ihtimali daha az bellek kullanan bir dizi benzeri bir yapı oluşturmaktır. Bu yapı ilişkisel (Basit Dizin erişim yeterli) gerek yok. Ayrıca dinamik yeniden boyutlandırma - tam olarak ne kadar büyük dizisi olacak biliyorum olması gerekmez. Ayrıca, tüm elemanları aynı türden olacaktır. Tıpkı eski C-dizisi.


Düzenleme: deceze'nin çözüm 32-bit tamsayı ile out-of-the-box çalışır. Ama eğer 64-bit bir sistem varsa bile, pack() 64-bit tamsayı destek vermiyor. Benim dizideki 64-bit tamsayı kullanmak için bazı bit-manipülasyon başvurdum. Belki parçacıkları aşağıda biri için yardımcı olacaktır:

function push_back(&$storage, $value)
{
    // split the 64-bit value into two 32-bit chunks, then pass these to pack().
    $storage .= pack('ll', ($value>>32), $value);
}

function get(&$storage, $idx)
{
    // read two 32-bit chunks from $storage and glue them back together.
    return (current(unpack('l', substr($storage, $idx * 8, 4)))<<32 |
            current(unpack('l', substr($storage, $idx * 8 4, 4))));
}

CEVAP
24 Ocak 2014, Cuma


Muhtemelen bir dize her şeyi saklayarak olduğunu göreceksin, ikili Paketli ve manuel dizin kullanın.

$storage = '';

$storage .= pack('l', 42);

// ...

// get 10th entry
$int = current(unpack('l', substr($storage, 9 * 4, 4)));

Bu "başlatma bir çırpıda yapılabilir ve sadece yapısından okuyorsun." dizisi ise mümkün olabilir Eğer dize ekleme çok ihtiyacınız varsa, bu son derece verimsiz olur. Hatta bu işi bir kaynak başa kullanılarak yapılabilir:

$storage = fopen('php://memory', 'r ');
fwrite($storage, pack('l', 42));
...

Bu çok etkili olur. Daha sonra bu tampon geri bir değişken okumak ve kullanmak gibi dize, ya da kaynak ve fseek ile çalışmaya devam edebilirsiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kai Moosmann

    Kai Moosmann

    5 Temmuz 2006
  • KoreanFrogMania님의 채널

    KoreanFrogMa

    18 Aralık 2011
  • steeletraining

    steeletraini

    28 NİSAN 2010