คุณสามารถลองใช้ประโยชน์จากการตกหล่นการโทรเฉพาะระบบLinuxหรือเทียบเท่ากับบรรทัดคำสั่ง FALLOC_FL_PUNCH_HOLE
โหมดช่วยให้คุณสามารถเป็นศูนย์จากส่วนใดส่วนหนึ่งที่กำหนดของไฟล์และที่เป็นไปได้บล็อกได้รับผลกระทบจะถูกปล่อยกลับไปยังระบบแฟ้มทำให้เบาบางไฟล์
ระบบไฟล์บางระบบไม่รองรับการโทรนี้ แต่ ext4 รองรับ
แนวคิดคือคุณแตกไฟล์ออกจากไฟล์เก็บถาวรจากนั้นใช้ fallocate เป็นศูนย์ในส่วนของไฟล์เก็บถาวรที่มีอยู่ พจนานุกรมของไฟล์เก็บถาวร zip เก็บออฟเซ็ตไปที่จุดเริ่มต้นของส่วนหัวของไฟล์แต่ละไฟล์และความยาวที่บีบอัดของไฟล์ภายในไฟล์เก็บถาวร
ตัวอย่างของแนวคิดนี่คือสคริปต์ Python3 ขั้นต่ำเพื่อแยกและทำการเรียกระบบในแต่ละไฟล์ คุณไม่ควรใช้งานโดยไม่ทำการทดสอบอย่างระมัดระวัง คุณอาจทำเช่นเดียวกันในเชลล์สคริปต์หากคุณสามารถดึงข้อมูล fallocate ไม่ได้อยู่ในไลบรารี Python มาตรฐานสำหรับฉันดังนั้นครึ่งแรกของสคริปต์ใช้ ctypes เพื่อเรียกมัน สคริปต์ต้องการไลบรารี python zipfile มันอาจต้องมีการเปลี่ยนแปลงอื่น ๆ สำหรับระบบของคุณ จำนวนเงินที่เป็นศูนย์ไม่รวมขนาดของส่วนหัวซึ่งจะหยุดพวกเขากลายเป็นหนึ่งในพื้นที่ที่ต่อเนื่องกัน
#!/usr/bin/python3
# https://superuser.com/a/1371106/458747
# int fallocate(int fd, int mode, off_t offset, off_t len)
import ctypes
libc = ctypes.cdll.LoadLibrary("libc.so.6")
fallocate = libc.fallocate
fallocate.argtypes = (ctypes.c_int, ctypes.c_int, ctypes.c_longlong, ctypes.c_longlong)
FALLOC_FL_PUNCH_HOLE = 2
FALLOC_FL_KEEP_SIZE = 1
import sys, subprocess, zipfile # will need zlib for compression
myzip = sys.argv[1]
fd = open(myzip,"r+")
fno = fd.fileno()
zf = zipfile.ZipFile(myzip, 'r')
for info in zf.infolist():
zf.extract(info)
# print(info.header_offset,info.compress_size)
rc = fallocate(fno, FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE,
info.header_offset, info.compress_size)
if rc!=0: print("fallocate failed\n")
subprocess.call("ls -ls "+myzip,shell=True)
ฉันทดสอบมันในไฟล์ zip แบบง่าย ๆ และคุณสามารถเห็นจำนวนคอลัมน์ของบล็อกที่ถูกใช้โดยการลดขนาดไฟล์ในขณะที่แต่ละไฟล์ถูกแตกไฟล์:
24224 -rw-r--r-- 25562742 Oct 29 22:56 ../my.zip
23292 -rw-r--r-- 25562742 Oct 29 22:56 ../my.zip
22524 -rw-r--r-- 25562742 Oct 29 22:56 ../my.zip
21524 -rw-r--r-- 25562742 Oct 29 22:56 ../my.zip
...
2800 -rw-r--r-- 25562742 Oct 29 22:56 ../my.zip
1868 -rw-r--r-- 25562742 Oct 29 22:56 ../my.zip
880 -rw-r--r-- 25562742 Oct 29 22:56 ../my.zip
124 -rw-r--r-- 25562742 Oct 29 22:56 ../my.zip