Çalma listesi önerilerinde kütüphaneyi yeniden taramadan güncellemek

这篇内容暂时只有 Türkçe 版本,以下是原文。

Kütüphanemde 3200 parça var, bunların yaklaşık 900’ü son üç yılda eklenmiş. Öneri listesi üretirken her seferinde tüm kütüphaneyi baştan taradığımda hem disk hem CPU tarafı rahatsız oluyordu; özellikle ağ üzerinden bağlı klasörlerde tarama dakikalara çıkıyordu. Ben de listeyi her seferinde sıfırdan kurmak yerine, yalnızca değişen parçaları işleyip geri kalanını önbellekten okumaya geçtim.

Önce kütüphanenin parmak izini çıkarıyorum. Dosya adına ve tarihine güvenmiyorum; çünkü kopyalama sırasında tarihler korunuyor, bazı araçlar da adı sessizce değiştiriyor. Bunun yerine parçanın kimliğini içerikten alıyorum:

import hashlib, os, json

def parmak_izi(yol):
    h = hashlib.sha1()
    with open(yol, 'rb') as f:
        # ilk 64 KB + son 64 KB yeterli, tamamını okumaya gerek yok
        h.update(f.read(65536))
        f.seek(-65536, os.SEEK_END)
        h.update(f.read(65536))
    return h.hexdigest()

Önbellek tek bir JSON dosyası: anahtar parmak izi, değer ise süre, örnekleme oranı ve etiketlerden çıkardığım birkaç alan. Yeni taramada yalnızca önbellekte olmayan parçalar işleniyor, silinenler de dosya listesiyle karşılaştırılıp düşülüyor.

Bunu neden böyle yaptım: bir parçanın etiketini okumak, dosyanın tamamını çözmekten çok daha ucuz; ama asıl kazanç, değişmeyen 3000 parçayı her seferinde yeniden işlememek. Önbellek dosyası 200 KB civarında kalıyor, yani listeden listeye taşınması sorun değil. Bedeli şu: önbellek bozulursa ya da elle silinirse ilk tarama yine uzun sürüyor; bunu kabul ettim, çünkü normal akışta bu nadir.

Bir sınır: dosyanın yalnızca başından ve sonundan örnek almak, ortası değişip boyutu aynı kalan dosyaları kaçırır. Benim kütüphanemde bu pek olmuyor ama bir ara etiket düzenleyicisiyle toplu düzeltme yaptığımda iki parçanın ortası değişmiş, parmak izi aynı kalmıştı; liste eski etiketleri göstermeye devam etti. O günden beri toplu düzenleme sonrası önbelleği elle siliyorum. Ayrıca ağ klasöründe dosya okuma yarıda kalırsa parmak izi yanlış çıkabilir; bu yüzden okuma hatasında parçayı önbelleğe yazmıyorum, bir sonraki taramada tekrar deniyor.

Sizin kütüphanenizde toplu etiket düzenlemesi yaptıktan sonra önbelleği nasıl tazeliyorsunuz, yoksa her seferinde tam taramaya mı dönüyorsunuz?

0
赞同度 100% · 0 条评论 · 1 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。