2016-04-11 18 views
2

Ben aynı birkaç dosya üzerinde File.ReadLines() kullanıyorum ve bu şekilde bir dosya okuma ile ilgili ek yükü bilmiyorum?C# bir txt dosyasını önbelleğe almak veya File.ReadLines kullanarak

Her dosya kimliğini (hash) bir txt dosyası içinde arıyorum.

Şu anda bu kodu kullanıyorum ancak bu dizin dosyalarını önbelleğe almam gerekip gerekmediğini merak ediyorum. Tereddütlerim, dosyaların her seferinde önbelleğe yeniden yüklenerek performansın artmasına neden olacak kadar sık ​​düzenlenecek olmasıdır. Her yinelemede metin dosyasına bir satır ekleyeceğim çok olasıdır (bir eşleşme olmayacaktır).

foreach (var myfile in allfiles) // roughly 5 thousand 
{ 
... 

    foreach (var line in File.ReadLines(myfile.path + "\index.txt")) 
    { 
     // compare the line to the current record's hash 
     if (myfile.hash.equals(line)) 
      ... 
      return x; 

    } 
... 
// otherwise add a new line (a hash) to index.txt 
} 

... 

dosyada bağlı kontrol edilmesi gereken farklı yollar yaklaşık 5-10 index.txt dosyaları böylece her biri önbelleğe gerekecektir ... vardır.

Dizin.txt dosyasını önbelleğe almak daha iyi bir fikir midir? File.ReadLines() yükü çok mu var?

Herhangi bir işaretçi için teşekkürler. Eğer yeterince kısa olan birçok dosyalarınız varsa

+0

Sana kimse bu cevap için kolay ve doğru yolu olmadığı kadar bu bir kendinizi test gerekecek düşünüyorum. Bağırmam, bunun için bir Sözlük kullanmanın daha hızlı olacağını, ancak test edene kadar bilmeyeceğinizi söylüyor. Onu inşa et ve test et. – Michael

+0

Soru şu ki, ramdaki tüm dosyaları saklayabilir misin? Yani bunlar 5k dosyaları değil mi? – Mafii

+0

Performans söz konusu olduğunda, varsayımlar üzerinde çalışmayın. Bir yürütücü ile yürütme sürelerini ölçün ve oradan yükün kabul edilebilir olup olmadığını bildiğinizden emin olabilirsiniz. –

cevap

2

, önbelleğe alma makul görünmektedir:

// Simplest, not thread safe 
    private static Dictionary<String, String[]> s_Files = 
    new Dictionary<string, string[]>(StringComparer.OrdinalIgnoreCase); 

    private static IEnumerable<String> ReadLines(String path) { 
    String[] lines; 

    if (s_Files.TryGetValue(path, out lines)) 
     return lines; 
    else { 
     lines = File.ReadAllLines(path); 

     s_Files.Add(path, lines); 

     return lines; 
    } 
    } 

    ... 

    foreach (var myfile in allfiles) { 
    ... 
    // Note "ReadLines" insread of "File.ReadLines" 
    foreach (var line in ReadLines(myfile.path + "\index.txt")) { 
    } 
    } 

iki uygulamaları karşılaştırın - olup olmadığına karar o zaman bu önbelleğe rutin ve - Geçerli bir - ve önbelleğe almak istersiniz.

+0

Bu harika, teşekkürler. Ancak benim örneğimde, eşleşme yoksa index.txt dosyasına yeni bir satır eklenir.Bu, önbelleğe yeniden yüklenmesi gerektiği anlamına gelir. Bu sık sık olur. – creatiive

+0

Bunun biraz değiştirilmiş bir sürümünü kullanarak bitti (dosya içeriğini depolamak için sözlük kullanarak). Teşekkürler. – creatiive

0

aşağıdaki öneriyoruz: Her karma dosyası

  • önbellek

  • önbellek çek eğer erişim üzerine karma dosyalarının içeriği için bellekte son güncelleme zaman damgası

    1. mağaza Dosyanın son güncellenmiş zaman damgası hafızanızda saklanandan büyüktür. Sözlük yerine ConcurrentDictionary kullanmak

    2. .

  • İlgili konular