Daha kısa sürede büyük boyutlu bir dosya oluşturma


18

Sıfırlar ve rastgele değerler ile dolu büyük bir dosya ~ 10G oluşturmak istiyorum. Kullanmayı denedim:

dd if=/dev/urandom of=10Gfile bs=5G count=10

Yaklaşık 2 GB'lık bir dosya oluşturur ve çıkış durumu '0' olan çıkış yapar. Nedenini anlayamıyorum?

Ayrıca kullanarak dosya oluşturmayı denedim:

head -c 10G </dev/urandom >myfile

Bunu oluşturmak yaklaşık 28-30 dakika sürer. Ama daha hızlı oluşturulmasını istiyorum. Herkesin bir çözümü var mı?

Ayrıca karşılaştırma için aynı (sözde) rastgele desen ile birden fazla dosya oluşturmak istiyorum. Bunu yapmanın bir yolunu bilen var mı?


AskUbuntu'ya hoş geldiniz! Büyük olasılıkla ddblok boyutu nedeniyle bir hata alıyorsunuz . Bu yazıya bakmak isteyebilirsiniz stackoverflow.com/questions/6161823/… en iyi blok boyutunu nasıl hesaplayacağınız, bazı kullanıcı komut dosyaları / programları ve diğer önerileri nasıl hesaplayabileceğiniz iyi cevaplara sahiptir dd.
Zaman Yok

Yanıtlar:


12

Fallocate kullanmaya ne dersiniz, bu araç bir dosya için alanın önceden yer değiştirmesini sağlar (dosya sistemi bu özelliği destekliyorsa). Örneğin, 'örnek' adlı bir dosyaya 5 GB veri tahsis edilmesi aşağıdakileri yapabilir:

fallocate -l 5G example

Bu, DD'den çok daha hızlıdır ve alanı çok hızlı bir şekilde tahsis edecektir.


Bu dosya rasgele veri içeriyor mu veya ayrılan disk alanında ne varsa içeriyor mu?
cprn

Tüm sıfırları içerecektir. Temel olarak, alan önceden konumlandırılır ve verileri değiştirmezseniz sıfır olduğu varsayılır.
Colin Ian King

Peki bu dampingden /dev/zerodaha hızlı olabilir mi?
cprn

1
Çok hızlıdır, çünkü önceden konumlandırmayı engelleyen bir sistem çağrısıdır (örneğin, alanı ayırır ancak minimum G / Ç yapar), burada / dev / zero'dan bir dosyaya dd'leme bir okuma / yazma yükü içerir.
Colin Ian King

Bunu ben yükseltiyorum. Yine de son bir soru ... truncateGeçmişte kullanıyordum ve dosyayı fiziksel olarak cihaza tahsis etmediğini ve kullanılabilir alana bakılmaksızın erişilinceye kadar keyfi büyük bir dosya oluşturduğunu öğrendim. Durumun böyle olmadığından emin misin fallocate? Kontrol ederdim ama cep telefonundayım ...
cprn

9

ddYalnızca sıfırlardan oluşan bir dosya oluşturmak için kullanabilirsiniz . Misal:

dd if=/dev/zero of=zeros.img count=1 bs=1 seek=$((10 * 1024 * 1024 * 1024 - 1))

Bu çok hızlı çünkü fiziksel diske gerçekten sadece bir bayt yazılıyor. Ancak, bazı dosya sistemleri bunu desteklemez.

Sahte rastgele içerikler içeren bir dosya oluşturmak istiyorsanız, şunu çalıştırın:

dd if=/dev/urandom of=random.img count=1024 bs=10M

Arabellek boyutu ( bs) olarak 10M kullanmanızı öneririm . Bunun nedeni, 10M'nin çok büyük olmamasıdır, ancak yine de size iyi bir tampon boyutu verir. Oldukça hızlı olmalı, ancak her zaman disk hızınıza ve işlem gücünüze bağlıdır.



1

Sorunuzun ilk bölümünü yanıtlama:

Çekirdeğiniz muhtemelen bunu desteklemediğinden, bir seferde 5 GB'lık bir arabellek yazmaya çalışmak iyi bir fikir değildir. Her durumda size herhangi bir performans avantajı sağlamaz. Bir seferde 1M yazmak iyi bir maksimumdur.


0

Bu soru 5 yıl önce açıldı. Sadece bununla karşılaştım ve bulgularımı eklemek istedim.

Eğer sadece

dd if=/dev/urandom of=random.img count=1024 bs=10M

xiaodongjie tarafından açıklandığı gibi önemli ölçüde daha hızlı çalışacaktır. Ancak, eatmydatabeğen kullanarak daha da hızlı yapabilirsiniz

eatmydata dd if=/dev/urandom of=random.img count=1024 bs=10M

Ne eatmydatayapar, fsync'i diskin daha hızlı yazmasını sağlar.

Bununla ilgili daha fazla bilgiyi https://flamingspork.com/projects/libeatmydata/ adresinde bulabilirsiniz .


1
Benim bakış ddaçımım başlamak için yeterince hızlı ve bir sebepten dolayı libEAT-MY-DATA olarak adlandırılıyor.
karel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.