คำนวณจำนวนเนื้อที่ดิสก์ที่จะถูกใช้


25

มีโปรแกรมบน Linux ที่สามารถคำนวณปริมาณข้อมูลที่โปรแกรมจะสร้างได้หรือไม่?

ตัวอย่างเช่นถ้าฉันต้องการสำรองข้อมูลฐานข้อมูล MySQL ของฉันฉันมักจะทำ

mysqldump > dumpfile.sql

แต่ฉันต้องการจะเปลี่ยนเส้นทาง/dev/nullแต่คำนวณว่าจะใช้พื้นที่ดิสก์มากแค่ไหนเช่น

mysqldump | fancy_space_calc_program

เอาท์พุท:

123456789 Bytes would have been used

หมายเหตุการสำรองข้อมูล MySQL เป็นเพียงตัวอย่าง ฉันรู้ดีว่าฉันสามารถประมาณขนาดก่อนหน้านี้ได้อย่างไรดังนั้นโปรดอย่าแสดงความคิดเห็นเกี่ยวกับเรื่องนี้


1
ฉันไม่คิดว่าคุณจะสามารถสร้างได้ สำหรับกรณีที่เฉพาะเจาะจงใช่ แต่ไม่ใช่การใช้งานทั่วไปเพราะคุณจะประเมินได้อย่างไรหากบางแอปโทรหาเซิร์ฟเวอร์และดาวน์โหลดข้อมูลจากที่นั่น - ไม่มีโอกาสที่คุณจะประเมินสิ่งต่าง ๆ ในแอพต่างประเทศ ดังนั้นนี่จะเป็นแอปต่อเมื่อคุณเขียนว่าคุณรู้จัก MYSQL แล้ว - ไม่มีคำอธิบาย แต่แอปอื่น ๆ - ต่อแอปไม่มีเครื่องมือทั่วไปใดที่สามารถทำนายได้อย่างถูกต้อง
Drako

1
ฉันหวังว่าคุณจะเข้าใจว่าความพยายามใด ๆ ในการประเมินจะต้องมีการเรียกใช้โปรแกรมและสังเกตผลลัพธ์ในขณะที่ส่งไปที่ใดที่หนึ่ง สิ่งนี้จะเป็นไปไม่ได้ถ้าโปรแกรมนั้นมีผลกระทบที่ไม่สามารถกลับคืนสภาพเดิมได้บางอย่างดังนั้นคุณจึงสามารถเรียกใช้ได้เพียงครั้งเดียวโดยไม่มีผลข้างเคียงที่ไม่ได้ตั้งใจ ปัญหาอื่นคือถ้าโปรแกรมได้รับเอาต์พุตจากอินพุตที่เปลี่ยนแปลงการรันครั้งถัดไปจะสร้างไฟล์เอาต์พุตอื่น (ขนาดแตกต่างกัน) สุดท้าย แต่ไม่ท้ายสุด: diskspace <> (จำนวนไบต์) และระบบไฟล์ต่าง ๆ มีค่าโสหุ้ยที่แตกต่างกันสำหรับการทำบัญชี
Tonny

1
ใช่ฉันรู้ดี มันยังดีพอสำหรับฉัน
fancyPants

@Drako คุณสามารถมีวิธีทั่วไปในการวัดเอาท์พุทข้อความของโปรแกรม ที่ไม่จำเป็นต้องเป็นต่อแอพ (ดูเช่นคำตอบที่ยอมรับได้) ไม่ว่าเอาต์พุตข้อความจะเหมือนกันอย่างน่าเชื่อถือในการรันครั้งต่อ ๆ มาหรือไม่นั้นเป็นแอพเฉพาะ แต่นั่นไม่ได้ป้องกันคุณจากการวัดเอาต์พุตด้วยวิธีทั่วไป สันนิษฐานว่า OP และใครก็ตามที่พยายามวัดเอาท์พุทจะทำเช่นนั้นหากข้อมูลมีความหมายสำหรับแอปพลิเคชันที่ระบุ
Jon Bentley

@ JonBentley ฉันไม่เคยบอกว่าคุณไม่สามารถอ่านได้อย่างระมัดระวัง: "ฉันเขียนคำทำนายทั่วไปจะไม่แม่นยำหรือใกล้เคียง :)" และตอนนี้คิดว่าแอพของฉันหลังจากทำงานจะตรวจสอบการปรับปรุงของตัวเองปลั๊กอิน ฯลฯ และจะดาวน์โหลด x จำนวนข้อมูลจาก i-net และเก็บไว้ใน hdd ของคุณ คุณจะวัดค่าล่วงหน้าอย่างแม่นยำด้วยเครื่องมือทั่วไปที่ไม่รู้อะไรเกี่ยวกับแอพของฉันจะต้องใช้พื้นที่เก็บข้อมูลเท่าใดหลังจากเรียกใช้แล้ว คุณยังสามารถคาดเดาคำตอบได้ดีที่สุดและในหลาย ๆ กรณีก็แม่นยำมาก
Drako

คำตอบ:


37

นำมาจากhttps://stackoverflow.com/questions/13418688/use-pipe-with-du-to-compute-size-of-stdin

คุณสามารถไพพ์ไปที่wc -cเพื่อนับจำนวนไบต์ที่ผ่านไปป์ไลน์

แน่นอนว่านี่เป็นเพียงไบต์ดิบและไม่มีอะไรเกี่ยวข้องกับภาคส่วนอื่น ๆ ดังนั้นเอาเกลือเม็ด ...


ขณะที่ผมเขียนทำนายทั่วไปจะไม่ได้ถูกต้องแม่นยำหรือแม้กระทั่งใกล้ :)
Drako

6
@cat การใช้งานที่ดีwcจะทิ้งข้อมูลที่ไม่ต้องการโดยเร็วที่สุด
Ruslan

2
@cat ฉันคิดว่ามันไม่น่าจะถูกบัฟเฟอร์เนื่องจากคุณไม่จำเป็นต้องทำการบัฟเฟอร์เพื่อนับจำนวนบรรทัดหรือตัวอักษร coreutils ของ GNU wcในคอมพิวเตอร์ของฉันจัดการกับข้อมูล stdin 40 GB ได้อย่างง่ายดายด้วยหน่วยความจำเพียง 8 GB
Frxstrem

8
@Magnus ฉันคิดว่าคุณพลาดคำศัพท์ ห้องสุขาเป็นคำศัพท์ภาษาอังกฤษสำหรับสิ่งที่ชาวอเมริกันเรียกห้องน้ำ คุณกำลังไพพ์ข้อมูลที่ไม่ได้ใช้ลงใน WC
คดีฟ้องร้องกองทุนโมนิก้า

3
@Frxstrem แน่นอนคุณทำจำเป็นต้องบัฟเฟอร์การนับเส้นหรือตัวอักษร - เร็วที่สุดเท่าที่คุณจะไม่ทำงานร่วมกับการเข้ารหัส isomorphic ตั้งแต่ POSIX.2 wc -cจะไม่นับตัวอักษรนับเป็นไบต์ wc -mนับจำนวนตัวอักษร ความแตกต่างที่ชัดเจนที่สุดคืออักขระหลายไบต์เช่นใน UTF-16 หรือ Windows \r\n(สองไบต์ใน ASCII แต่เป็นอักขระหนึ่งตัว) ไม่จำเป็นต้องใช้บัฟเฟอร์มากนักในเวลาส่วนใหญ่ แต่ Unicode สามารถมีจำนวนไบต์ที่กำหนดเองเพื่อแทนอักขระเดียว ไม่ใช่สิ่งที่คุณเห็นในข้อมูลที่เชื่อถือได้ แต่เป็นเวกเตอร์บัฟเฟอร์ล้นที่เป็นไปได้
Luaan

28

คำสั่ง pv เหมาะสำหรับสิ่งนี้

mysqldump | pv -b > /dev/null

ฉันคิดว่าข้างต้นจะให้คำสั่งที่ถูกต้องที่คุณต้องการมันอาจต้องมีการปรับบางอย่างเช่นpv -b | > /dev/nullฉันไม่สามารถทดสอบได้ในขณะนี้

-b ให้ค่าเป็นไบต์


1
ศักดิ์สิทธิ์ฉันลืมเกี่ยวกับ pv เช่นเดียวกับห้องสุขา น่าอายจริงๆเรา. ฉันต้องการยอมรับทั้งคำตอบ ดังนั้นขออภัย แต่แมกนัสก็เร็วขึ้นเล็กน้อยและเขาสามารถใช้ชื่อเสียงได้
fancyPants

ใช่ไม่ต้องกังวลเคล็ดลับ wc นั้นดีจริง ๆ ไม่แน่ใจว่าทำไมมันถึงไม่เกิดขึ้นกับฉันทันที ฉันไป 'บาร์!' เป็นครั้งแรก จากนั้นตระหนักว่าสิ่งที่ฉันหมายถึงคือ pv! :)
djsmiley2k - CoW

และตอนนี้คุณมีฉันสงสัยเกี่ยวกับการคว้าที่จับไฟล์และตรวจสอบขนาดใน / proc ที่ไหนสักแห่ง ....
djsmiley2k - CoW

2
ผมไม่เคยได้ยินpvมาก่อน .. คุณเรียนรู้สิ่งใหม่ทุกวัน :)
แมกนัส

2
@ Magnagnus: ฉันคิดว่า wc นั้นเก่ากว่า (เป็นส่วนหนึ่งของระบบ Unix ที่เก่ากว่า) ไม่ได้อยู่ในเอกสารมากนักและ (อาจเป็นไปได้) pv นั้นได้รับการติดตั้งไว้ล่วงหน้าในการกระจายที่น้อยลง ยังดีที่รู้เกี่ยวกับ ดูภาพแนวคิดที่สวยงามซึ่งมาจากหน้าแรกของโปรแกรม "pv" ("ไปป์")
TOOGAM

0

คุณสามารถใช้มันเช่นนี้ddcat /dev/zero | dd status=progress of=/dev/null bs=4M

สิ่งนี้จะให้ข้อมูลบางอย่างระหว่างและหลังการดำเนินการเกี่ยวกับปริมาณข้อมูลที่ส่งผ่านไปเช่น:

$ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.