เหตุใดข้อมูลเดียวกันจึงใช้พื้นที่มากกว่าในไฟล์ข้อความมากกว่าในไฟล์ Excel


59

ฉันมีข้อมูลประมาณ 100,000 แถว ถ้าฉันเก็บข้อมูลนี้ในรูปแบบไฟล์ข้อความจะใช้พื้นที่มากกว่าถ้าฉันเก็บไว้ในรูปแบบไฟล์ Excel ทำไมถึงเป็นอย่างนั้น?

คำตอบ:


118

xlsxรูปแบบการใช้งานโดยที่ทันสมัย Excel เป็นจริงรูปแบบบีบอัด มันเป็นไฟล์ ZIP ซึ่งมีไฟล์ text (XML) ในโครงสร้างที่แน่นอน

หากคุณบีบอัดไฟล์ข้อความธรรมดาด้วยเครื่องมือบีบอัด ZIP ที่คล้ายกันคุณควรมีขนาดไฟล์ใกล้เคียงกัน

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


9.1.3 แพ็คเกจทางกายภาพ

เอกสาร Office Open XML แต่ละเอกสารจะถูกนำไปใช้เป็นไฟล์ ZIP

- ECMA-376-1: 2016


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


2
มันเยี่ยมมาก! มันให้ความเข้าใจที่ดีมากเกี่ยวกับวิธีจัดการกับไฟล์ Excel ขอบคุณ!
Dominique

3
@Dominique หากคุณต้องการทราบข้อมูลเพิ่มเติมคุณสามารถเล่นโดยใช้การคลายไฟล์ (เช่นกับ 7zip หรือเปลี่ยนชื่อเพื่อให้มันจบ.zip) มีสเป็คให้ใช้เช่นกัน แต่มันทำให้การอ่านค่อนข้างแห้ง
Bob

3
ฉันคิดว่า excel ยังใช้พจนานุกรมสตริงที่ซึ่งบิตของข้อความที่เหมือนกันระหว่างเซลล์สามารถนำมาใช้ซ้ำได้ในขณะที่จัดเก็บเพียงครั้งเดียวเท่านั้น
แบรดลีย์ Uffner

1
จาก API ที่เปิดเผยโดยไลบรารี Apache ooxml พจนานุกรมสตริงที่ใช้ร่วมกันอย่างน้อยน่าจะเป็นไปได้
Morgen

2
Shared Strings เป็นคุณลักษณะของ Excel แม้เมื่อเขียนไฟล์ XLS (ไม่ x) ซึ่งเป็นรูปแบบการบันทึกที่เรียกว่า BIFF ภายในคอนเทนเนอร์ OLE หากคุณเปรียบเทียบข้อกำหนด XLS แบบเก่ากับ XLSX คุณจะเห็นว่า XLSX เป็นเพียง BIFF เวอร์ชัน xmlified แบบ xmlified ที่มีการเปลี่ยนแปลง ดังนั้นพื้นฐาน MS ไม่ได้คิดค้นคุณลักษณะสตริงที่ใช้ร่วมกันสำหรับ XLSX ซึ่งมันไม่สมเหตุสมผลนักเนื่องจากการบีบอัด พวกเขาไปตามเส้นทางที่ง่ายที่สุดในการเปลี่ยน XLS เป็น XLSX
Guntram Blohm

2

คำตอบที่ได้รับนั้นถูกต้องเนื่องจาก Excel เก็บข้อมูลของคุณเป็น xml นอกจากนี้เนื่องจากการเรียงลำดับข้อมูลของคุณอย่างมีประสิทธิภาพจะช่วยลดขนาดไฟล์ ทดสอบด้วยตัวเอง - บอกว่าคุณมีข้อมูลเช่น

A            B                              C
John         Smith-Johnson-Williamson       12345
Sally        Smith-Johnson-Williamson       67890
John         Williams                       34567

หากคุณเรียงลำดับตาม C (คอลัมน์ที่มีค่าที่ไม่ซ้ำทั้งหมดหรือเกือบทั้งหมด) เท่านั้นค่าที่เหมือนกันของ B จะไม่ติดกัน ใน xml ของ Excel ดูเหมือนว่า:

<12345><John><Smith-Johnson-Williamson>
<34567><John><Williams>
<67890><Sally><Smith-Johnson-Williamson>

หากคุณเรียงลำดับตาม B (คอลัมน์ที่มีค่าทั่วไป) ดังนั้นค่าที่เหมือนกันจะอยู่ติดกัน ใน xml ของ Excel ดูเหมือนว่า:

<Smith-Johnson-Williamson><John><12345>
  <Sally><67890>
<Williams><John><34567>

เนื่องจากสตริงที่มีความยาวเหมือนกันและอยู่ติดกัน Excel จึงรู้ว่ามันสามารถรวมเข้าด้วยกันคล้ายกับเมื่อผู้คนเขียนรายการและเพื่อทำซ้ำส่วนหนึ่งของบรรทัดด้านบนพวกเขาพิมพ์เครื่องหมายคำพูดแทนที่จะเขียนสิ่งเดียวกันซ้ำ ฉันไม่พบหลักฐานใด ๆ ของพจนานุกรมสตริงที่ใช้ร่วมกันในการสืบสวนของฉัน - เพียงแค่การเยื้องนี้แทนค่าของฟิลด์ซ้ำ

ฉันมีรายชื่อผู้รับจดหมาย 250,000 รายใน 11 รัฐเท่านั้นและในแต่ละระเบียนมีเขตข้อมูลที่เป็นหนึ่งในสองสายที่ระบุข้อเสนอที่ได้รับ พนักงานของเรามีเหตุผลบางอย่างที่คุ้นเคยกับการค้นหาผู้คนตามที่อยู่ถนนของพวกเขาตามที่พูดดังนั้นมันจึงถูกจัดเรียงในคอลัมน์หมายเลขถนนจากนั้นชื่อถนนเมือง ฯลฯ ... เมื่อฉันใช้ข้อเสนอแรกจากนั้นระบุ รหัสไปรษณีย์เมืองชื่อถนนหมายเลขถนนและที่อยู่บรรทัดที่ 2 ในที่สุดขนาดไฟล์ลดลงอย่างไม่น่าเชื่อ ฉันตรวจสอบ xml ที่คลายการบีบอัดบนไฟล์ที่เรียงลำดับแต่ละวิธีเพื่อดูว่าเกิดอะไรขึ้นและด้านบนคือสิ่งที่ฉันอนุมาน หากมีหลายฟิลด์ที่มีตัวอักษรมากกว่า 5 ตัว แต่มีค่า จำกัด (เช่นการจำหน่ายตั๋วเช่น 'แก้ไข', 'ถูกปฏิเสธ', 'อนุมัติ' ฯลฯ )


สวัสดี CompanionCube นี่เป็นความรู้ที่ยอดเยี่ยมอย่างยิ่ง !!! ขอบคุณมาก.
734178

-5

หากคุณมีตัวเลขเช่น 3.14159265359 คุณต้องมี 13 ไบต์เพื่อเก็บสิ่งนี้ในไฟล์ข้อความ หากคุณเก็บหมายเลขนี้เป็นทุ่นคุณต้องมีเพียง 4 ไบต์


19
แม้ว่านี่อาจเป็นกรณีของxls(BIFF) แต่ฉันไม่คิดว่าxlsxจะทำเช่นนี้ xlsxเก็บข้อมูลทั้งหมดในไฟล์ XML ซึ่งไม่ได้ทำการเข้ารหัสเลขฐานสอง - มันถูกแปลงและเก็บเป็นสตริงข้อความ ฉันยังคงพยายามตามส่วนที่เกี่ยวข้องของข้อกำหนด แต่การทดสอบเชิงประจักษ์ของฉัน (เช่นการแยกเอกสารที่บันทึกไว้) แสดงให้เห็นว่า1.123ถูกจัดเก็บเป็นสตริงตัวอักษร 5 ตัวใน XML
Bob

14
ECMA-376-1: 2016 § 18.3.1.4 c(เซลล์)แสดงให้เห็นว่าเซลล์เก็บข้อมูลไว้ในvแท็กตามที่กำหนดไว้ในECMA-376-1: 2016 .3 18.3.1.96 v(มูลค่าเซลล์)ที่พวกเขาบอกว่าค่าที่เป็นไปได้สำหรับองค์ประกอบนี้ ถูกกำหนดโดย ST_Xstring simple type (§22.9.2.19) - มีตัวอย่างเช่น<v>28086.3541666667</v>ที่เก็บข้อมูลอย่างชัดเจนเป็นสตริง
Bob

4
@gerrit แต่น่าเสียดายที่ Excel ไม่ตีความตัวเลขเป็นลอยภายในโปรแกรมที่นำไปสู่ปัญหาที่น่าสนใจเช่นหมายเลขโทรศัพท์วางตัวเลขไม่กี่สุดท้าย มันไม่ได้บันทึกไว้ในดิสก์ในรูปแบบลอยตัว (อีกต่อไป?)
Bob

2
@Bob นี้ยังเป็นกรณีสำหรับxlsbที่ขอแนะนำสำหรับแผ่นใหญ่
phuclv

2
ฉันไม่รู้ว่าทำไมคำตอบนี้จึงทำให้มีจำนวนโหวตมาก สหกรณ์ไม่ได้ระบุรูปแบบ Excel ดังนั้นเทคนิคนี้ยังเป็นคำตอบที่ถูกต้อง
phuclv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.