Ne kadar disk alanı kullanılacağını hesaplayın


25

Linux'ta bir programın ne kadar veri üreteceğini hesaplayabilen bir program var mı?

Örneğin, MySQL veritabanımın yedeğini almak istersem genellikle

mysqldump > dumpfile.sql

Bunun yerine, yönlendirmek istiyorum /dev/nullancak ne kadar disk alanı kullanılacağını hesaplamak istiyorum.

mysqldump | fancy_space_calc_program

Çıktı:

123456789 Bytes would have been used

Not, MySQL yedeği sadece bir örnek. Önceden boyutu nasıl tahmin edebileceğimin çok iyi farkındayım, bu yüzden lütfen bunun hakkında yorum yapmayın.


1
Gerçekten yapabileceğini bile sanmıyorum; Belirli durumlar için evet, ancak genel kullanım için değil, çünkü bazı uygulamaların bir sunucuyu çağırıp buradan veri indirdiğini tahmin edebilirsiniz - yabancı uygulamalarda bu tür şeyleri tahmin etme şansınız yok. Bu yüzden bu uygulama başına olacaktır - MYSQL için zaten bildiğinizi yazdığınız gibi - orada açıklama yok, ancak diğer uygulamalar - uygulama başına, genel bir araç böyle bir öngörmeyi doğru yapamadı.
Drako

1
Umarım tahminde bulunma girişiminin programı çalıştırmak ve güvenli bir yere gönderilirken çıktıyı gözlemlemek zorunda kalacağını fark edersiniz. Program başka bir şey üzerinde geri dönüşü olmayan bir etkiye sahipse bu imkansız olacak, böylece SADECE istenmeyen yan etkiler olmadan bir kez çalıştırabilirsiniz. Diğer sorun, programın çıktısını değişen bir girdiden alması durumunda bir sonraki çalıştırmanın başka (farklı boyutta) bir çıktı dosyası yaratacağıdır. Son fakat en az olmayan: disk boşluğu <> (çıktının baytı). Ve çeşitli dosya sistemlerinin defter tutma için farklı giderleri vardır.
Tonny

1
Evet, bunun farkındayım. Hala benim için yeterince iyi.
fancyPants

@Drako Programın metin çıktısını ölçmenin genel bir yolunu bulabilirsiniz. Bunun uygulama başına olması gerekmez (örneğin, kabul edilen cevaba bakınız). Metin çıktısının sonraki çalıştırmalarda güvenilir bir şekilde aynı olup olmayacağı, uygulamaya özeldir, ancak bu, çıktınızı genel bir şekilde ölçmenizi engellemez. Muhtemelen OP ve çıktıyı ölçmeye çalışan herhangi biri, yalnızca verinin herhangi bir uygulama için anlamlı olması durumunda bunu yapacaktır.
Jon Bentley

@JonBentley Size asla sahip olamayacağınızı söylemedim, daha dikkatlice okuyun: "Genel tahmin yazdığım gibi kesin veya yakın olmayacak :)" ve şimdi çalıştırdıktan sonra uygulamamın eklentilerin güncellemelerini kontrol edeceğini hayal edin , vb. ve i-net'teki x veri miktarını indirir ve onu hdd'nize kaydeder; Uygulamam hakkında hiçbir şey bilmeden, genel araçla önceden nasıl bir ölçüm yapacaksınız, çalıştırdıktan sonra ne kadar depolama alanı gerekli olacak? Yine de, en iyi tahmininizi kabul edilmiş cevaplarla yapabilirsiniz ve çoğu durumda oldukça kesindir.
Drako

Yanıtlar:


37

Alındığı https://stackoverflow.com/questions/13418688/use-pipe-with-du-to-compute-size-of-stdin

Sen boru o kadar olabilir wc -cboru hattı geçer bayt sayısını saymak için.

Tabii ki, bu sadece ham bayt ve sektör büyüklüğü vb. İle ilgisi yok, bu yüzden bir tuz taneleri ile alın ...


Genel tahminlerimi yazdığım gibi kesin ve hatta yakın olmayacak :)
Drako

6
@ cat iyi bir uygulama, wcen kısa sürede artık ihtiyaç duyduğu verileri atar.
Ruslan

2
@ cat 'ın arabelleğe alınmasının olası olmadığını düşünüyorum çünkü satırları veya karakterleri saymak için arabelleğe almanıza gerek yok. wcBilgisayarımdaki GNU coreutilsleri yalnızca 8 GB bellekle 40 GB stdin verisini kolayca yönetiyor.
Frxstrem

8
@Magnus. Sanırım sözcüğü kaçırdın. WC, Amerikalıların banyo dediği şey için İngiliz bir terimdir. Kullanılmayan verileri WC'ye aktarıyorsunuz.
Fon Monica'nın Davası

3
@Frxstrem Kesinlikle yapmak çizgiler veya karakterleri saymak gerek arabelleğe - en kısa sürede artık bir izomorf kodlama çalışıyoruz olarak. POSIX.2'den beri wc -ckarakter saymaz - bayt sayar. wc -mkarakterleri sayar. En belirgin fark, UTF-16 veya Windows'taki gibi çok baytlık karakterlerde \r\n(ASCII'de iki bayt, ancak bir karakter). Mutlaka çoğu zaman tamponlama gerektirmez, ancak Unicode tek bir karakteri temsil etmek için isteğe bağlı bayt miktarına sahip olabilir; güvenilir verilerde göreceğiniz bir şey değil, olası bir arabellek taşması vektörü.
Luaan

28

Pv komutu bunun için idealdir.

mysqldump | pv -b > /dev/null

Yukarıdakilerin size istediğiniz komutu vereceğini düşünüyorum, pv -b | > /dev/nullşu anda test edemem gibi bazı ayarlamalar gerekebilir

-b size bayt cinsinden bir değer verir.


1
Kutsal, wc kadar pv'yi de unuttum. Ayıp bana. Her iki cevabı da kabul etmek istiyorum. Yani, üzgünüm, ama Magnus biraz daha hızlıydı ve itibarını kullanabilir.
fancyPants

Evet, endişelenmeyin, wc numarası gerçekten güzel, neden bunun hemen bana gelmediğinden emin değilim. İlk önce 'bar'a gittim! sonra ne demek istediğimi pv oldu! :)
djsmiley2k - CoW

Ve şimdi beni dosya tanıtıcısını
kapmayı ve bir

2
Daha önce hiç duymadım pv.. Her gün yeni bir şeyler öğreniyorsunuz :)
Magnus

2
@Magnus: wc'nin eski olduğunu (bazı eski Unix sistemlerinin bir parçası), çok fazla dokümantasyonda olmadığını ve (muhtemelen sonuç olarak) pv'nin daha az dağıtımda önceden yüklendiğini düşünüyorum. Yine de bilmek güzel. "Pv" ("boru görüntüleyici") programının ana sayfasından gelen bu kavramsal güzel resme bakın
TOOGAM

0

Bunun için kullanabilirsiniz dd, böyle cat /dev/zero | dd status=progress of=/dev/null bs=4M.

Bu, yürütme sırasında ve sonrasında kendisine aktarılan veri miktarı hakkında bazı veriler sağlar:

$ cat /dev/zero | dd status=progress of=/dev/null                                                                                                                              
5371334656 bytes (5.4 GB, 5.0 GiB) copied, 4 s, 1.3 GB/s^C # this is progress data
12271136+0 records in #summary
12271135+0 records out #summary
6282821120 bytes (6.3 GB, 5.9 GiB) copied, 4.66683 s, 1.3 GB/s #summary
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.