Dosya önbelleğini kullanmadan büyük dosyaları daha hızlı kopyalayabilir miyim?

17

preload paketini ekledikten sonra, uygulamalarım hızlanıyor gibi görünüyor, ancak büyük bir dosyayı kopyalarsam dosya önbelleği dosyanın boyutunun iki katından fazla büyüyor.

Tek bir 3-4 GB sanal kutu görüntüsünü veya video dosyasını harici bir sürücüye aktararak, bu devasa önbellek önceden yüklenmiş tüm uygulamaları bellekten kaldırır ve böylece yükleme süreleri ve genel performans düşüşleri artar.

Büyük, çok gigabaytlı dosyaları içermeden kopyalamak için bir yol var mı (yani dosya önbelleğini atlayarak)? Veya belirli klasörlerin beyaz listeye alınmasını veya kara listeye alınmasını engellemenin bir yolu nedir?

    
sordu Veazer 17.04.2012 16:37

3 cevap

17

nocache ve ionice gibi bir komuta önceden eklenmiş olan nice yardımcı programı var. Herhangi bir açık çağrıya posix_fadvise bayrağıyla POSIX_FADV_DONTNEED ekleyen bir kitaplığı önyükleyerek çalışır.

Basit bir şekilde, belirli bir dosya için önbelleğe alınmanın gerekmediği çekirdeği önerir ; Çekirdek sonra normalde dosyayı önbelleğe alamaz. Teknik ayrıntılar için burayı ziyaret edin.

Her türlü büyük kopyalama işi için harikalar yaratıyor, e. g. Çok terabaytlı bir diski arka planda çalışan sistem üzerinde mümkün olan en az etkiyle yedeklemek isterseniz, nice -n19 ionice -c3 nocache cp -a /vol /vol2 boyunca bir şeyler yapabilirsiniz.

Ubuntu 13.10 ve üstü bir paket mevcut olacak. Daha önceki bir sürümdeyseniz, 13.10 paketini yükleyebilir veya bu 12.04 backport .

    
verilen cevap Gunther Piez 03.07.2012 10:55
10

Tek büyük dosyalar için, dosya önbelleğini atlamak için doğrudan G / Ç ile dd kullanın:

Bir (veya birkaç) büyük çoklu gigabayt dosyasını aktarmak istiyorsanız, dd ile yapmak çok kolay:

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
  • direct bayrakları, dd 'ı, kernel'in doğrudan I / O seçeneğini ( O_DIRECT ) okuma ve yazma sırasında kullanacağını, böylece dosya önbelleğini tamamen atladığını belirtir.
  • bs blocksize seçeneği, dd dosyasının gerçekleştirmesi gereken fiziksel disk işlemlerinin sayısını en aza indirgemek için makul bir büyük değere ayarlanmalıdır, çünkü okuma / yazma işlemleri önbelleğe alınmadığından ve çok küçük doğrudan işlemlerin sonuçlanmasına neden olabilir. ciddi yavaşlama.
    • 1'den 32 MB'ye kadar değerler ile deneme yapmaktan çekinmeyin; Yukarıdaki ayar 4 MB'dir ( 4M ).

Birden fazla / özyineleli dizin kopyaları için , maalesef, kolayca erişilebilen araçlar yoktur; normal cp , vb. doğrudan G / Ç'yi desteklemez

.

/ e iflag & amp; yongalar doğru iflag & amp; Oflag

    
verilen cevap ish 26.06.2012 02:45
0

Bir dizini dd ve find kullanarak mkdir ile kopyalayabilirsiniz.

İki sorun için geçici olarak sorun çözmemiz gerekiyor:

  1. dd , dizinlerle ne yapacağını bilmiyor
  2. dd , bir kerede yalnızca bir dosya kopyalayabilir

İlk önce giriş ve çıkış dizinlerini tanımlayalım:

SOURCE="/media/source-dir"
TARGET="/media/target-dir"

Şimdi cd 'ini kaynak dizine koyalım, böylece find kolayca işleyebileceğimiz göreli dizinleri rapor edecektir:

cd "$SOURCE"

Dizin ağacını $SOURCE ile $TARGET

arasında kopyalayın
find . -type d -exec mkdir -p "$TARGET{}" \;

Dosyaları $SOURCE ile $TARGET yazım önbelleğini (ancak okuma önbelleğini kullanarak) kopyalar.

find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;

Lütfen bunun, dosya değiştirme sürelerini, sahipliğini ve diğer özelliklerini korumayacağını unutmayın.

    
verilen cevap unfa 26.04.2017 16:00

Etiketlerdeki diğer soruları oku