SORU
5 EYLÜL 2008, Cuma


() yüksek blok reading

Boyutu 100 GB veya daha fazla olabilecek dosyalar işleme olacak bir program üzerinde çalışıyorum. Dosyaları değişken uzunlukta kayıt kümelerini içerir. İlk bir uygulama var ve çalışıyor ve şimdi, giriş dosya birçok kez taranan aldığından daha verimli I/O yapıyor performansını artırmaya yönelik, özellikle arıyorum.

Orada yüksek kullanarak için genel bir kural() C) bloklar halinde okuma karşı 's fstream kütüphane? Yapmak istediğim bir tampon içine diskten büyük blok okunur, tampon komple kayıtları işlemek ve daha fazla bilgi edinin.

En yüksek() yüksek kod blokları sayfa boyutu sınırları üzerinde durmam gerek. (bu çok karışabilir potansiyel olarak (benim anladığım) ve kayıt potansiyel olarak sayfa sınırları arasında gibi. Fstreams ile, sadece sayfa boyutu sınırları yalan blokları okumakla sınırlı olmadığımız bir kayıt başlatmak için isteyin ve tekrar okumaya başlayın, ben.

Nasıl, tam bir uygulama ilk yazılı olmadan bu iki seçenek arasında karar verebilirim? Başparmak kuralları (örneğin, yüksek() daha hızlı 2x) veya basit testler?

CEVAP
17 HAZİRAN 2011, Cuma


Yüksek / son sözü Linux üzerinde okuma performansı bulmaya çalışıyordum ve karşısında güzel bir yazı (link) Linux kernel e-posta listesinde geldim. Bu 2000'den, yani yok olmuş birçok iyileştirmeler için IO ve sanal bellek çekirdek o zamandan beri, ama güzel açıklıyor nedenini mmap read olabilir daha hızlı ya da daha yavaş.

  • mmap bir Ara read epoll read Daha fazla yükü olan, poll, Daha fazla yük var gibi () daha fazla yük vardır. Sanal bellek eşleştirmeleri farklı işlemler pahalıdır arasında geçiş aynı nedenlerle bazı işlemcilerde oldukça pahalı bir işlemdir.
  • IO sistem zaten disk önbelleği kullanabilir, dosya okumak, önbelleği isabet veya kullandığınız ne olursa olsun Bayan.

Ancak

  • Hafıza haritaları özellikle erişim desenleri seyrek ve öngörülemeyen genellikle rasgele erişim için daha hızlı.
  • Hafıza Haritalar için izin verirdevam etişin bitene kadar önbellekten sayfaları kullanarak. Bu bir dosya ağır uzun bir süre için kullanın, kapatın ve yeniden açın, sayfaları hala saklanır anlamına gelir. read, dosya önbelleğinden yıllar önce temizlendi olabilir. Bu bir dosya kullanın ve atın hemen geçerli değildir. (8 ** sadece önbellekte tutmak için sayfaları çalışırsanız, disk önbelleği zekası için çalışıyoruz ve bir kuruntu bu tür nadiren sistem performansını yardımcı olur).
  • Doğrudan bir dosya okuma çok basit ve hızlıdır.

Yüksek okuma/tartışma diğer iki performans tartışmaları hatırlatıyor:

  • Bazı Java programcıları G/Ç yapmayan varsa, G/Ç yapmayan daha fazla sistem çağrıları yapmak gerektirir eğer sık sık mükemmel mantıklı olan G/Ç, engelleme daha yavaş olduğunu keşfetmek için şok oldu.

  • Başka bir ağ programcıları epoll epoll yönetme daha fazla sistem çağrıları yapmak gerektiğini biliyor genellikle mantıklı olan poll, daha yavaş olduğunu öğrenmek için şok oldu.

Sonuç:Hafıza haritaları eğer access veri rastgele, devam etrafında uzun bir süre için, ve sen-ebilmek pay o ile diğer işlemler (MAP_SHARED değil çok ilginç yoksa gerçek paylaşım). Okumak normalde sırayla veri erişimi veya okuduktan sonra silmek dosyaları. Ve eğer her iki yöntemi programınızı daha karmaşık yaparbu. Pek çok gerçek dünya durumlarda gerçek bir uygulama ve bir kriter DEĞİL test yapmadan daha hızlı olduğunu göstermek için yolu var.

(Necro para için üzgünüm bu soruyu ama bir cevap arıyordum ve bu soru Google sonuçlarının üstünde kaldı.)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • failblog

    failblog

    17 HAZİRAN 2008
  • pain975

    pain975

    27 NİSAN 2008
  • Within Temptation

    Within Tempt

    18 EYLÜL 2006