ถ้าเด็กสมัยนี้มาอ่านก็จะบอกว่า database เกือบทั้งหมดมันก็เก็บลงเป็นไฟล์นั้นละ ยกเว้นแรมเหลือเฟือไปสั่งให้ใช้ RAM เก็บข้อมูล แต่ที่จะบอกคือในสมัยก่อน ๆ ที่จะมีดาต้าเบสให้ให้พรี ๆ ง่าย ๆ กันแบบนี้ สมัยก่อนเค้าเก็บข้อมูลกันแบบ Plain text เก็บข้อมูลใน ไฟล์ .txt แล้วเขียน code มาอ่านตัวอักษรที่ เท่าไหร่ ถึงตัวที่เท่าไหร่แบบนี้ เวลาจะโอนยอดธนาคารเยอะ ๆ ต้องไปติดต่อ bank ว่าถ้าจะทำ batch transfer โอนที่ละมาก ๆ มีเอกสารรับรอง รู้จักผู้จัดการสาขา เค้าถึงจะให้ Format มาให้ ที่สำคัญคือแต่ละธนาคารจะมี “ฟอร์แมต” ของตัวเอง
เรียกว่าอะไร ?
ในทางเทคนิคเรามักเรียกรูปแบบการเก็บและอ่านข้อมูลแบบนี้ว่า
- Fixed-width Text File: คือไฟล์ที่กำหนดไว้ชัดเจนว่า ข้อมูลชุดที่ 1 อยู่ที่ตัวอักษรที่ 1-10, ชุดที่ 2 อยู่ที่ 11-20 เป็นต้น
- Byte Offset / Seeking: คือการใช้คำสั่ง ( เช่น
fseekใน C หรือseek()ใน Python ) เพื่อกระโดดข้ามตัวอักษรไปยังตำแหน่ง ( Offset ) ที่เราต้องการอ่านทันทีโดยไม่ต้องไล่จากบรรทัดแรก
นิยมใช้ตอนไหน ?
แม้ปัจจุบันเราจะนิยมใช้ JSON หรือ CSV มากกว่า แต่เทคนิคการระบุตำแหน่งตัวอักษรยังจำเป็นมากในกรณีต่อไปนี้
- Legacy Systems ( ระบบธนาคาร / ประกัน ): ระบบ Mainframe สมัยก่อนมักส่งข้อมูลเป็นเส้นยาว ๆ ( Flat File ) โดยไม่มีตัวคั่น ( Delimiter ) แต่ใช้การนับจำนวนตัวอักษรแทน เพราะประหยัดพื้นที่และประมวลผลเร็ว
- ไฟล์ที่มีขนาดใหญ่ยักษ์ ( Large Data Sets ): ถ้าไฟล์มีขนาดหลาย GB การจะอ่านตั้งแต่ต้นจนจบเพื่อหาข้อมูลบรรทัดสุดท้ายจะช้ามาก การ “Seek” ไปยังตำแหน่งที่ต้องการโดยตรงจะทำได้ทันที ( O(1) complexity )
- Binary Files: การอ่านไฟล์ภาพ, วิดีโอ หรือไฟล์ระบบ ( เช่น Header ของไฟล์ .exe ) จะต้องระบุตำแหน่ง Byte ที่แน่นอนเพื่อดึงข้อมูล Metadata ออกมา
- Database Engine: เบื้องหลังของฐานข้อมูล ( SQL / NoSQL ) ใช้เทคนิคนี้ในการเก็บ Data Page เพื่อให้หาข้อมูลเจอได้อย่างรวดเร็ว สรุปคือ ยังใช้วิธีนี้หาข้อมูลกันซินะ แค่ไม่รู้ตัว
- ระบบ IOT อย่างเครื่องสแกนนิ้ว ที่มี cpu , mem ไม่มาก ตัวอย่างที่เจอล่าสุดคือเครื่อง อ่านบัตรประชาชนจาก chip รู้หมดตั้งแต่ที่อยู่ รูปถ่าย เอาจริง ๆ ถ้าคิดว่าถ้าอ่าน low level มันมีอะไรมากกว่าที่เห็นหน้าบัตรนะ
ตัวอย่างการเขียน Code ( Python )
สมมติเรามีไฟล์ data.txt ที่เก็บรหัสพนักงาน ( 5 หลัก ) ตามด้วยชื่อ ( 10 หลัก ): 00001Somchai 00002Wichai
with open("data.txt", "rb") as f:
# สมมติอยากอ่านชื่อคนที่ 2 (เริ่มที่ตัวอักษรที่ 20)
f.seek(20)
name = f.read(10) # อ่านต่อไปอีก 10 ตัวอักษร
print(name.decode().strip())
ข้อควรระวัง
- ถ้าเว้นไม่พอ อย่างหัวหน้าเก่าผม นามสกุล … ณ อยุธยา ก็เกิน 10 ตัวอักษรไปแล้ว
- เว้นน้อยไปก็ไม่พอ
- มากไปก็เปลืองพื้นที่ ยิ่งในสมัยนั้นเค้าใช้ floppy disk 5.25 นิ้ว ( High Density – HD ): 1.2 MB เดี่ยวนี้รูปถ่ายใบเดียวก็ใส่มันไม่พอแล้ว
- การลงโปรแกรมใหม่หรือย้ายระบบอาจทำให้ Config หาย การจัดการไฟล์ข้อมูลดิบแบบนี้ก็เช่นกันครับ หากมีการเปลี่ยน Encoding ( เช่นจาก ASCII เป็น UTF-8 ) ตำแหน่งตัวอักษร ( Offset ) อาจจะเพี้ยนได้ ทำให้ Code อ่านค่าผิดพลาด
