SORU
27 Temmuz 2009, PAZARTESİ


Önbellek İptal Olur Genel bir Çözüm?

"Sadece iki sabit sorun var Bilgisayar Bilimi: önbellek iptal ve adlandırma şeyler."

Phil Karlton

; Girişi her zaman taze veri almak için garanti edilir o kadar bayat, ne zaman bilmek bir önbellek geçersiz için genel bir çözüm ya da yöntem var mı?

Örneğin, bir dosyadan veri alır bir işlev getData() düşünün. Adını her zaman kontrol eden dosyanın son değiştirilme zamanı esas alır.< / ^ br . Sonra verileri dönüştüren 2 ** ikinci bir işlev eklemek ve önbelleğe işlevi adlı bir dahaki sefere onun sonucu. Dosya bilgisi - nasıl dosya değiştirilirse, bu önbellek geçersiz olması bağımlılık ekleyin musun?

getData() transformData() denir her zaman arayıp önbellek oluşturmak için kullanılan değer ile karşılaştırmak, ancak bu çok masraflı olmuyor olabilir.

CEVAP
27 Temmuz 2009, PAZARTESİ


Sen ne diyorsun bir şey, kendi kontrolü dışında değiştirilebilir olan bir bağımlı olduğunu ömür boyu bağımlılık zincirleme.

Eğer bir idempotent fonksiyonu a, b c****, a b aynı c aynı ama maliyet kontrol b Yüksek ya da:

  1. sen bir ara ile güncel bilgiler işletmek ve her zaman b kontrol değil, kabul
  2. elinden geleni b kontrol mümkün olduğunca hızlı yapmak

Eğer pasta var ve bu yemek...

Eğer üst katman ek bir önbellek a göre o zaman bu ilk sorunu bir nebze etkiler. Eğer 1 seçerseniz kendine verdiğin şey var ve böylece önbellek daha fazla ama b önbelleğe alınan değer geçerliliğini göz önüne almayı unutmayın. Eğer isterseniz 2 hala b her zaman kontrol etmelisiniz ama eğer b doğru çıkarsa a önbellek geri düşmek.

Sen katman önbelleğe ihlal olup olmadığını düşünmeniz gerekir 'kurallar' kombine davranışlarının bir sonucu olarak. sistemin varsa

a b yaparsa o zaman bir geçerliliği olmadığını biliyorsanız gibi (yalancı) önbelleğinizi düzenlemek:

private map<b,map<a,c>> cache // 
private func realFunction    // (a,b) -> c

get(a, b) 
{
    c result;
    map<a,c> endCache;
    if (cache[b] expired or not present)
    {
        remove all b -> * entries in cache;   
        endCache = new map<a,c>();      
        add to cache b -> endCache;
    }
    else
    {
        endCache = cache[b];     
    }
    if (endCache[a] not present)     // important line
        result = realFunction(a,b); 
        endCache[a] = result;
    else   
        result = endCache[a];
   return result;
}

Belli ki art arda katman (x) önemsiz olduğu sürece, her aşamada geçerlilik yeni eklenen giriş maçlar a:b ilişki x:b x:a.

Ancak hiçbir katman mümkün olabilir yani tamamen bağımsız olan üç girişi (veya döngüsel olduğunu), gayet mümkündür. Bu satırı // işaretli önemli değişiklik olacak

(endCache[a]süresi dolmuş yayok)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jared Busch

    Jared Busch

    25 Mayıs 2011
  • Kamikazeepanda

    Kamikazeepan

    5 ŞUBAT 2006
  • superemposed

    superemposed

    25 Aralık 2007