ממיר גדלי נתונים

ממיר גודל ליחידות עשרוניות ובינאריות בבת אחת — KB מול KiB, ‏MB מול MiB — עם ביטים, מספר הבייטים המדויק ומה שכל מערכת הפעלה מציגה.

בייטים במדויק
1,000,000,000,000
עשרוני
חזקות של 1000 — תקן SI, יצרני דיסקים, macOS
  • B1,000,000,000,000
  • KB1,000,000,000
  • MB1,000,000
  • GB1,000
  • TB1
בינארי
חזקות של 1024 — תקן IEC, ‏Windows, זיכרון
  • KiB976,562,500
  • MiB953,674.3164
  • GiB931.3226
ביטים
חזקות של 1000 — מהירויות רשת הן תמיד עשרוניות
  • bit8,000,000,000,000
  • Kb8,000,000,000
  • Mb8,000,000
  • Gb8,000
  • Tb8
איך הכלים שלכם יציגו את זה

אותם בייטים, חמש קריאות. אף אחת אינה שגויה; הן חלוקות על המחלק, על התווית, או על שניהם.

  • ‏Windows Explorer — מחלק ב-1024 ומשאיר את התוויות העשרוניות931 GB
  • ‏Finder ב-macOS — מחלק ב-10001 TB
  • ‏ls -lh, ‏du -h — מחלקים ב-1024932G
  • ‏ls --si, ‏du --si — מחלקים ב-10001.0T
  • יצרני דיסקים והתקני USB — מחלקים ב-10001 TB

מה הכלי הזה עושה

הקלידו גודל בכל יחידה — ‏1 TB, ‏1536 MiB, ‏900 Mb, או פשוט מספר בייטים גולמי שהעתקתם מרשימת קבצים — והוא חוזר מומר לשתי מערכות היחידות בבת אחת, יחד עם מספר הבייטים המדויק ועם האופן שבו כל אחד מהכלים במחשב שלכם יציג אותו.

שתי המערכות מוצגות זו לצד זו ולא מאחורי מתג, מפני שכל הקושי בגדלי נתונים הוא ששתיהן בשימוש ושתיהן קוראות לעצמן באותו שם. מספר לבדו לא אומר לכם איזו מהן הפיקה אותו.

למה לקילובייט יש שתי משמעויות

מחשבים ממענים זיכרון בחזקות של שתיים, ולכן 1024 הוא מספר עגול טבעי למכונה באופן ש-1000 לעולם לא יהיה. בשלב מוקדם הושאלה המילה «קילו» עבור 1024 מפני שהיא הייתה קרובה מספיק לאלף של SI ואיש לא ציפה שהשתיים יתרחקו זו מזו. הן התרחקו.

השגיאה קטנה בקצה הנמוך ומצטברת בכל צעד. קילובייט נבדל ב-2.4%, מגה-בייט ב-4.9%, ג׳יגה-בייט ב-7.4%, טרה-בייט ב-10%. עד הפטה-בייט שתי התשובות רחוקות ב-12.6%, וזה כבר לא פרט של עיגול:

KB    1,000                 KiB    1,024                 # הפרש של 2.4%
MB    1,000,000             MiB    1,048,576             # 4.9%
GB    1,000,000,000         GiB    1,073,741,824         # 7.4%
TB    1,000,000,000,000     TiB    1,099,511,627,776     # 10.0%

בשנת 1998 נתן ארגון IEC לחזקות של 1024 שמות משלהן — קיביבייט, מביבייט, גיביבייט, והסמלים KiB, ‏MiB, ‏GiB — בדיוק כדי שאפשר יהיה לכתוב ולסלק את הדו-משמעות. השמות מעולם לא נקלטו בשימוש יומיומי, אבל הסמלים כן, וכל דבר שמסומן KiB הוא חד-משמעי. כל דבר שמסומן KB עדיין אינו.

מי סופר באיזו דרך

החלוקה אינה מקרית. היא נופלת בערך על הקו שבין חומרה שממענים אותה לבין חומרה שמוכרים אותה:

  • זיכרון RAM הוא תמיד בינארי. מודול זיכרון של 16GB הוא 16GiB, מפני שזיכרון ממוען בשורות ובעמודות בינאריות ולא היה יכול להיות מספר עשרוני עגול גם אילו ניסה.
  • דיסקים הם תמיד עשרוניים. יצרן שמוכר דיסק של טרה-בייט מתכוון ל-1,000,000,000,000 בייטים, וכך מאז הרבה לפני שמישהו התלונן על כך.
  • ‏Windows בינארית אבל משתמשת בתוויות העשרוניות. היא מחלקת ב-1024 וכותבת GB, ומשם מגיע רוב הבלבול שאנשים באמת חווים.
  • ‏macOS עשרונית מאז Snow Leopard ב-2009. אותו דיסק שמראה 931GB ב-Windows מראה טרה-בייט אחד ב-Mac, ואף אחת מהמכונות אינה תקולה.
  • כלי שורת הפקודה של לינוקס נותנים את שניהם: ‏ls -lh ו-du -h מחלקים ב-1024, והדגל ‎--si באותן פקודות מחלק ב-1000.
  • רשתות הן תמיד עשרוניות, והן סופרות ביטים ולא בייטים.

הדיסק של טרה-בייט שמופיע כ-931GB

זו השאלה הנפוצה ביותר על גדלי נתונים, והתשובה היא שלא חסר שום מקום. הדיסק מחזיק בדיוק את מה שהקופסה אמרה. פשוט Windows מחלקת את הבייטים האלה ב-1024 שלוש פעמים במקום ב-1000, ואז מדפיסה תווית שאומרת אחרת.

1,000,000,000,000 bytes         # מה שהיצרן מכר
/ 1024 = 976,562,500 KB         # Windows מחלק פעם אחת
/ 1024 = 953,674.32 MB          # פעמיים
/ 1024 = 931.32 GB              # שלוש פעמים, ואז מסמן GB

הדיסק אינו קטן מהמפורסם ומערכת ההפעלה אינה משקרת על מספר הבייטים. הדבר היחיד השגוי הוא התווית: מה ש-Windows קוראת לו 931GB הוא באמת 931GiB, ו-931GiB הם טרה-בייט אחד. הדביקו כל גודל בכלי הזה ושני הטורים יראו את היחס הזה ישירות.

ביטים ובייטים, והפער של פי שמונה

בייט הוא שמונה ביטים, ושניהם נבדלים בכתיב רק ברישיות של אות אחת: ‏B גדולה מציינת בייטים, ‏b קטנה מציינת ביטים. ‏Mb ו-MB נבדלים בפי שמונה, וזה יותר ממספיק כדי להפוך חישוב לחסר שחר.

זה חשוב במיוחד למהירויות רשת, שמצוטטות בביטים לשנייה בזמן שגדלי קבצים והתקדמות הורדה נמדדים בבייטים. חיבור של 100Mb/s מעביר לכל היותר 12.5MB/s, ולכן קובץ של ג׳יגה-בייט לוקח בערך 80 שניות ולא את העשר שהמספרים כאילו מבטיחים. שום דבר לא מאט אתכם; היחידות מעולם לא היו זהות.

ביטים מוצגים כאן רק במערכת העשרונית, וזו אינה פשטנות. קצבי רשת מוגדרים בחזקות של עשר, ולכן מגה-ביט הוא מיליון ביטים בכל מקום שבו המונח בשימוש. ארגון IEC אמנם מגדיר יחידות ביט בינאריות, אבל כמעט שום דבר לא משתמש בהן, והצעתן הייתה מזמינה המרה שאיש לא מתכוון אליה.

למה המספרים כאן מדויקים

מספרים ב-JavaScript מחזיקים שלמים במדויק רק עד בערך תשעה קוודריליון — ‏2^53. אקסה-בייט הוא 10^18, הרבה מעבר לזה, ולכן ממיר הבנוי על אריתמטיקה רגילה מתחיל לאבד ספרות בדיוק במקום שבו חיות שאלות האחסון הגדול, ומדווח מספר בייטים ששגוי בביטחון בספרותיו האחרונות.

כאן הכול משתמש בשלמים בדיוק אינסופי במקום זאת. זה גם קונה משהו פחות מובן מאליו: מפני שכל גורם שמעורב כאן הוא חזקה של עשר או חזקה של שתיים, ושתיהן מתחלקות בשלמות באיזושהי חזקה של עשר, כל המרה בין היחידות האלה מסתיימת כשבר עשרוני סופי. ‏1 TB אינו בערך 931.32 GiB — הוא 931.322574615478515625 GiB, בלי שארית. השורות כאן מעוגלות לקריאה, ומספר הבייטים שמעליהן הוא התשובה המלאה.

שאלות נפוצות

קילובייט הוא 1000 בייטים או 1024 בייטים?
שניהם, תלוי מי סופר. תקן SI ויצרני הדיסקים משתמשים ב-1000; ‏Windows וגדלי זיכרון משתמשים ב-1024. ארגון IEC נתן ליחידות ה-1024 שמות נפרדים — קיביבייט, מביבייט, גיביבייט — וזה מסלק את הדו-משמעות, אף שהתוויות הישנות עדיין בכל מקום. הכלי הזה מציג את שתי הקריאות בבת אחת במקום לבחור אחת.
למה הדיסק שלי של טרה-בייט מראה רק 931GB?
שום דבר לא חסר. היצרן מכר לכם 1,000,000,000,000 בייטים, בספירה של חזקות אלף. ‏Windows מחלקת את זה ב-1024 שלוש פעמים, מקבלת 931.32, ואז מסמנת את התוצאה GB. אותם בייטים, מחלק אחר, תווית מטעה — מה שהיא מראה לכם הוא באמת 931GiB.
מה ההבדל בין MB לבין MiB?
מגה-בייט הוא 1,000,000 בייטים ומביבייט הוא 1,048,576 בייטים, ולכן MiB גדול בערך ב-4.9%. ‏MiB חד-משמעי מעצם הגדרתו; ‏MB חד-משמעי רק אם אתם יודעים באיזו מוסכמה נוקט הכלי שהדפיס אותו.
למה ההורדה שלי איטית ממהירות החיבור?
בדרך כלל מפני שהשניים נמדדים ביחידות שונות. מהירויות חיבור מצוטטות במגה-ביט לשנייה והורדות במגה-בייט לשנייה, ויש שמונה ביטים בבייט. קו של 100Mb/s מגיע לכל היותר לכ-12.5MB/s.
מה בעצם אומרת מגבלת העלאה או אחסון של 25MB?
זה תלוי בשירות, וההנחה הבטוחה היא המספר הקטן יותר. אם המגבלה נאכפת כ-25 כפול 1,000,000 בייטים, קובץ שקצת פחות מ-25MiB יידחה. המרה של גודל הקובץ שלכם לשני הטורים כאן מראה מיד אם הוא עובר את שתי הקריאות.
האם הכלי מטפל בגדלים גדולים מאוד?
כן. האריתמטיקה משתמשת בשלמים בדיוק אינסופי, ולכן אקסה-בייט, זטה-בייט ויוטה-בייט מומרים במדויק במקום לאבד את ספרותיהם האחרונות כפי שמספרי נקודה צפה רגילים עושים מעבר ל-2^53.
האם משהו שאני מקליד נשלח לשרת?
לא. זו אריתמטיקה בדפדפן שלכם; שום דבר אינו מועלה או נרשם, וזה עובד בלי חיבור רשת.