Rumah >pembangunan bahagian belakang >masalah PHP >Apakah yang perlu saya lakukan jika tatasusunan php menggunakan terlalu banyak memori?

Apakah yang perlu saya lakukan jika tatasusunan php menggunakan terlalu banyak memori?

PHPz
PHPzasal
2023-04-23 10:09:08763semak imbas

Dalam proses menggunakan bahasa pengaturcaraan PHP, anda mungkin mendapati bahawa sesetengah atur cara menyebabkan penggunaan memori pelayan yang berlebihan apabila memproses sejumlah besar data. Salah satu sebab utama ialah tatasusunan PHP mengambil terlalu banyak memori.

PHP ialah bahasa pengaturcaraan yang fleksibel dan mudah dipelajari. Dalam PHP, tatasusunan ialah struktur data yang berkuasa yang boleh diubah saiznya, menyimpan sebarang jenis nilai dan setiap elemen boleh diakses dengan kunci. Walaupun tatasusunan PHP sangat mudah, ia kadangkala boleh menyebabkan masalah ingatan.

  1. Kerja dalaman tatasusunan PHP

Tatasusunan PHP dilaksanakan melalui jadual cincang. Apabila anda menambah elemen pada tatasusunan, PHP mencincang kunci elemen, menyimpannya dalam jadual cincang, dan kemudian menyimpan nilai elemen di bawah kunci yang sepadan dalam jadual cincang. Apabila mengakses elemen tatasusunan, PHP akan menggunakan fungsi cincang yang sama untuk mencari indeks dalam tatasusunan yang sepadan dengan nilai cincang nama kunci untuk mendapatkan nilai elemen. Dengan cara ini, elemen tatasusunan boleh diakses dengan cepat.

Walau bagaimanapun, pendekatan ini melibatkan kos penggunaan memori yang agak tinggi. Tatasusunan PHP bukan sahaja perlu menyimpan nilai elemen itu sendiri, tetapi juga perlu menyimpan nama kunci dan indeks elemen yang sepadan. Apabila memproses sejumlah besar data, overhed memori tambahan ini boleh menyebabkan PHP berjalan perlahan atau malah menyebabkan program ranap.

  1. Penggunaan memori yang diduduki oleh tatasusunan PHP

Untuk menggambarkan dengan lebih baik memori yang diduduki oleh tatasusunan PHP dalam atur cara, kita boleh menjalankan program ujian berikut:

$startMemory = memory_get_usage();
$array = [];

for($i = 0; $i < 1000000; $i++){
    $array[] = $i;
}

$endMemory = memory_get_usage();

echo "Memory used: " . ($endMemory - $startMemory)/1024/1024 . " MB";

Atur cara di atas mencipta tatasusunan kosong dan menambah 1 juta integer padanya. Selepas semua elemen telah ditambah, program mengeluarkan jumlah memori yang digunakan oleh proses tersebut. Pada MacBook Pro saya, outputnya ialah:

Memory used: 76 MB

Ini menunjukkan bahawa program kecil ini menggunakan 76MB ruang memori. Dan jika kita meningkatkan bilangan elemen yang ditambahkan dalam program kepada 10000000, program akan menduduki lebih daripada 900MB memori selepas dijalankan, dan jumlah ini akan meningkat apabila bilangan elemen meningkat.

  1. Kaedah untuk mengoptimumkan memori tatasusunan PHP

Untuk menyelesaikan masalah tatasusunan PHP yang mengambil terlalu banyak memori, kita boleh menggunakan kaedah berikut untuk mengoptimumkan:

(1) Gunakan SplFixedArray

SplFixedArray PHP ialah pelaksanaan tatasusunan bersaiz tetap yang menggunakan kurang memori daripada tatasusunan PHP biasa, tetapi ia hanya boleh menyimpan bilangan elemen tertentu. Tatasusunan tetap ini berguna apabila anda perlu memproses sejumlah besar data.

Berikut ialah contoh kod pelaksanaan SplFixedArray Kami membandingkannya dengan program sebelumnya:

$startMemory = memory_get_usage();
$array = new SplFixedArray(1000000);

for($i = 0; $i < 1000000; $i++){
    $array[$i] = $i;
}

$endMemory = memory_get_usage();

echo "Memory used: " . ($endMemory - $startMemory)/1024/1024 . " MB";

Hasil output ialah:

Memory used: 7.25 MB

Seperti yang anda boleh. lihat, Menggunakan SplFixedArray, kami mencapai tugas yang sama menggunakan kurang daripada 10MB ruang memori.

(2) Gunakan penjana

Penjana ialah jenis data yang baru diperkenalkan dalam PHP5.5 yang membolehkan anda menjana nilai apabila diperlukan dan bukannya menyimpan semua nilai dalam memori. Menggunakan penjana boleh mengurangkan penggunaan memori dengan ketara. Berikut ialah contoh kod yang dilaksanakan menggunakan penjana:

$startMemory = memory_get_usage();
function generator($max){
    for($i = 0; $i < $max; $i++){
        yield $i;
    }
}

$array = generator(1000000);

$endMemory = memory_get_usage();

echo "Memory used: " . ($endMemory - $startMemory)/1024/1024 . " MB";

Hasil output ialah:

Memory used: 0.25 MB

Dengan menggunakan penjana, kami hanya menggunakan 0.25MB ruang memori untuk melengkapkan tugas yang sama.

(3) Memproses elemen dalam kelompok

Jika menggunakan SplFixedArray atau penjana tidak dapat memenuhi keperluan anda, anda boleh mempertimbangkan untuk memproses elemen tatasusunan dalam kelompok. Penggunaan memori tatasusunan PHP boleh dikurangkan dengan membahagikan tatasusunan kepada beberapa segmen yang lebih kecil dan memproses setiap segmen data satu demi satu.

Anda boleh menggunakan fungsi array_chunk untuk membahagikan tatasusunan kepada segmen yang lebih kecil dan kemudian memproses setiap segmen data satu demi satu. Berikut ialah contoh kod:

$startMemory = memory_get_usage();
$array = [];

for($i = 0; $i < 1000000; $i++){
    $array[] = $i;
}

$tempArrays = array_chunk($array, 10000);

foreach($tempArrays as $tempArray){
    //处理临时数组
}

$endMemory = memory_get_usage();

echo "Memory used: " . ($endMemory - $startMemory)/1024/1024 . " MB";

Menggunakan kaedah ini, anda boleh mengawal memori yang digunakan oleh atur cara, sambil turut meningkatkan prestasi atur cara semasa memproses sejumlah besar data.

  1. Ringkasan

Dalam pengaturcaraan PHP, tatasusunan ialah struktur data yang sangat biasa. Walau bagaimanapun, memandangkan tatasusunan PHP dilaksanakan menggunakan jadual cincang, kadangkala ia boleh menyebabkan masalah ingatan. Apabila memproses sejumlah besar data, mengoptimumkan penggunaan memori program anda harus dipertimbangkan dengan teliti. Dengan membahagikan tatasusunan kepada segmen yang lebih kecil, menggunakan SplFixedArray atau penjana, dan satu siri strategi pengoptimuman, anda boleh mengawal penggunaan memori program dan meningkatkan prestasi program.

Atas ialah kandungan terperinci Apakah yang perlu saya lakukan jika tatasusunan php menggunakan terlalu banyak memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn