Bellek / Optimizasyon endişe

2 Cevap php

Ben 500.000 kayıtları kadar işleme olabilir, karmaşık bir senaryo çalışıyorum. İşte benim sorum.

Temelde benim kod bu 500.000 kadar kayıtların her almak için bir metin dosyası ayrıştırma olacaktır. Her kayıt bir kategori olacak, benim kod categories tabloda yeni bir rekor söz konusu işlenirken, bu kategori için yaratılmış olsaydı, kontrol etmek gerekir, ve değilse, bu kaydı yaratacaktır.

Yani 2 seçeneğiniz var:

1) Ben tuşları kategori adını ve kimliğini içeren => değerler bir dizi depolamak, yani ben bunu:

if (array_key_exists($category,$allCategories))
   $id=$allCategories[$category];
else
{
   mysql_query("INSERT INTO categories (procId,category) 
                       VALUES ('$procId''$category')");
   $id=mysql_insert_id();
   $allCategories[$category]=$id;
}

2) Bu metin dosyası işlenir her zaman, kendi süreç kimliği alırsınız. Yani oldukça 100.000 + girdileri için büyümek olabilir $allCategories değişkeni kontrol etmek yerine, bunu yapabilirsiniz:

SELECT id FROM categories WHERE procId='$procId' AND category='$category'

Burada olumsuz bu sorgu 500,000 + kayıtların her biri için çalışacak olmasıdır. Bir dizideki tüm kategoriler tutma dezavantajı bellek veya sunucunun tükendi olmasıdır oysa kaza olabilir.

Herhangi bir düşünce?

2 Cevap

Sadece zaten ekledikten kimlikleri bir listesini tutabilirsiniz? Onlar tamsayı kimlikleri ise, o 4 bayt 100.000 girişleri sadece 400K bellek kullanmak her kat bulunuyor.

ETA:

Kategori adını depolamak önlemek için, adını karma ve karma saklayın. 128 bit MD5 hash ile, bu karmaşanın başına ya da yalnızca bellek + havai 1.6MB yaklaşık 16 bayt bulunuyor.

Ortalama kategori adı 30 bayt olduğu göz önüne alındığında, sadece 30 * 500000 byte = 15.000.000 bayt = 15000 kilobayt = 1,5 megabayt gerekiyordu.

Seni bu kadar bellek var.