ฉันมีข้อมูลประมาณ 100,000 แถว ถ้าฉันเก็บข้อมูลนี้ในรูปแบบไฟล์ข้อความจะใช้พื้นที่มากกว่าถ้าฉันเก็บไว้ในรูปแบบไฟล์ Excel ทำไมถึงเป็นอย่างนั้น?
ฉันมีข้อมูลประมาณ 100,000 แถว ถ้าฉันเก็บข้อมูลนี้ในรูปแบบไฟล์ข้อความจะใช้พื้นที่มากกว่าถ้าฉันเก็บไว้ในรูปแบบไฟล์ Excel ทำไมถึงเป็นอย่างนั้น?
คำตอบ:
xlsx
รูปแบบการใช้งานโดยที่ทันสมัย Excel เป็นจริงรูปแบบบีบอัด มันเป็นไฟล์ ZIP ซึ่งมีไฟล์ text (XML) ในโครงสร้างที่แน่นอน
หากคุณบีบอัดไฟล์ข้อความธรรมดาด้วยเครื่องมือบีบอัด ZIP ที่คล้ายกันคุณควรมีขนาดไฟล์ใกล้เคียงกัน
นอกจากนี้ตามที่กล่าวถึงโดยBradley UffnerและMorgenในความคิดเห็น Excel จะทำซ้ำสตริงที่เหมือนกันและเก็บสำเนาหนึ่งชุดเท่านั้น ฉันไม่แน่ใจเกี่ยวกับวิธีการดังกล่าวที่แน่นอนและขึ้นอยู่กับชุดข้อมูลของคุณ แต่การบีบอัดไฟล์ซิปแบบง่ายอาจทำให้คุณได้รับประโยชน์มากที่สุด 1
9.1.3 แพ็คเกจทางกายภาพ
เอกสาร Office Open XML แต่ละเอกสารจะถูกนำไปใช้เป็นไฟล์ ZIP
1ฉันเดาว่าการขจัดข้อมูลซ้ำซ้อนนี้มีประสิทธิภาพมากที่สุดเมื่อคุณมีแผ่นงานหลายแผ่นเนื่องจากการบีบอัด zip ใช้กับแต่ละไฟล์ในไฟล์เก็บถาวรและเฉพาะส่วนที่ จำกัด ของข้อมูลในแต่ละครั้งโดยการจัดเก็บสตริงทั้งหมดไว้ในไฟล์เดียว ควรได้รับประโยชน์จากการบีบอัดในภายหลัง ยิ่งกว่านั้นหากรูปแบบข้อความล้วนของคุณอยู่ในไฟล์เดียวอย่างไรก็ตามอาจมีความแตกต่างเล็กน้อย
.zip
) มีสเป็คให้ใช้เช่นกัน แต่มันทำให้การอ่านค่อนข้างแห้ง
คำตอบที่ได้รับนั้นถูกต้องเนื่องจาก 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 ตัว แต่มีค่า จำกัด (เช่นการจำหน่ายตั๋วเช่น 'แก้ไข', 'ถูกปฏิเสธ', 'อนุมัติ' ฯลฯ )
หากคุณมีตัวเลขเช่น 3.14159265359 คุณต้องมี 13 ไบต์เพื่อเก็บสิ่งนี้ในไฟล์ข้อความ หากคุณเก็บหมายเลขนี้เป็นทุ่นคุณต้องมีเพียง 4 ไบต์
xls
(BIFF) แต่ฉันไม่คิดว่าxlsx
จะทำเช่นนี้ xlsx
เก็บข้อมูลทั้งหมดในไฟล์ XML ซึ่งไม่ได้ทำการเข้ารหัสเลขฐานสอง - มันถูกแปลงและเก็บเป็นสตริงข้อความ ฉันยังคงพยายามตามส่วนที่เกี่ยวข้องของข้อกำหนด แต่การทดสอบเชิงประจักษ์ของฉัน (เช่นการแยกเอกสารที่บันทึกไว้) แสดงให้เห็นว่า1.123
ถูกจัดเก็บเป็นสตริงตัวอักษร 5 ตัวใน XML
c
(เซลล์)แสดงให้เห็นว่าเซลล์เก็บข้อมูลไว้ในv
แท็กตามที่กำหนดไว้ในECMA-376-1: 2016 .3 18.3.1.96 v
(มูลค่าเซลล์)ที่พวกเขาบอกว่าค่าที่เป็นไปได้สำหรับองค์ประกอบนี้ ถูกกำหนดโดย ST_Xstring simple type (§22.9.2.19) - มีตัวอย่างเช่น<v>28086.3541666667</v>
ที่เก็บข้อมูลอย่างชัดเจนเป็นสตริง
xlsb
ที่ขอแนะนำสำหรับแผ่นใหญ่