Tại sao các tệp văn bản 4kB?


47

Vì một số lý do, khi tôi tạo một tệp văn bản trên OS X, nó luôn có ít nhất 4kB, trừ khi nó trống. Tại sao lại thế này? Có thể có 4.000 byte siêu dữ liệu khoảng 1 byte văn bản thuần túy?

nhập mô tả hình ảnh ở đây


16
4096 byte, không phải 4000.
Ốc cơ khí

8
@M Mechanicalsnail 4095. Bạn đã quên một byte dữ liệu thực tế
Tobias Kienzler

5
@ Cơ học là một năm nhuận, phải không? xkcd.com/394 :P
tkbx

Câu trả lời:


52

Kích thước khối của hệ thống tệp phải là 4 kB. Khi dữ liệu được ghi vào một tệp có trong một hệ thống tệp, hệ điều hành phải phân bổ các khối lưu trữ để chứa dữ liệu sẽ được ghi vào tệp.

Thông thường, khi một hệ thống tệp được tạo, bộ lưu trữ chứa trong hệ thống tệp đó được phân thành các khối có kích thước cố định. Bài viết Wikipedia này giải thích ngắn gọn quá trình này.

Kích thước khối cơ bản của hệ thống tệp cho tệp này phải có kích thước khối 4K. Tệp này đang sử dụng 1 khối 4K và chỉ một byte trong khối đó chứa dữ liệu thực tế.


10
Một nhận xét: Trong Windows, kích thước tệp thực tế được hiển thị theo mặc định và kích thước trên đĩa được hiển thị trong ngăn Tùy chọn.
Joe Z.

Vì vậy, một khối có thể chứa các tập tin khác nhau?
sudeepdino008

@ sudeepdino008 không, một khối (ít nhất) cho mỗi tệp (hệ thống tệp mở rộng của Linux có / had (?) một tùy chọn để đặt nhiều tệp trong một khối, nhưng đó là một ngoại lệ đối với quy tắc)
Ro-ee

13

Tất cả các hệ thống tệp có kích thước cụm hoặc khối hoặc dung lượng đĩa nhỏ nhất có thể được phân bổ để giữ tệp. Ngay cả khi kích thước tệp thực tế nhỏ hơn kích thước cụm / khối, nó vẫn sẽ tiêu thụ một cụm hoặc 4K trên hệ thống tệp của bạn. Kích thước cụm phụ thuộc vào hệ thống tệp và các tùy chọn hệ thống tệp.

Nếu nó chứa 0 byte, như Gilles đã chỉ ra , nó sử dụng các khối / cụm 0 nhưng một nút trên các hệ thống tệp * nix điển hình, sẽ trả lời tốt hơn cảnh báo, "trừ khi nó trống."


6
Ngay cả khi kích thước tệp bằng 0 byte, nó vẫn sẽ tiêu thụ một cụm. Thực tế, không: trên các hệ thống tệp unix điển hình, một tệp trống tiêu thụ một khối inode và zero và không có khái niệm nào về cụm khác với các khối.
Gilles 'SO- ngừng trở nên xấu xa'

8

Một thí nghiệm nhỏ để giúp minh họa điều này:

Trước tiên, hãy xem kích thước khối thực tế của phân vùng ext4 gốc (LVM) của tôi là gì:

[root@fedora17 blocksize]# dumpe2fs /dev/mapper/vg_fedora17-lv_root | grep -i "block size"
dumpe2fs 1.42.3 (14-May-2012)
Block size:               4096

Đó là 4096 (4 KiB), như mong đợi. Bây giờ, hãy tạo ba tệp: Đầu tiên là 0 byte, thứ hai chỉ là một byte và thứ ba là 4 KiB (kích thước khối):

[root@fedora17 blocksize]# touch 0_bytes.bin
[root@fedora17 blocksize]# dd if=/dev/zero of=1_byte.bin bs=1 count=1
[root@fedora17 blocksize]# dd if=/dev/zero of=4096_bytes.bin bs=1 count=4096


Bây giờ, chúng tôi lsthư mục. Chúng tôi sử dụng -stùy chọn để xem kích thước được phân bổ (cột ngoài cùng bên trái), với số lượng "khối" 1024 byte.
(Tôi không biết kích thước khối thực là 4096 - chúng tôi có thể chỉ định --block-sizenhưng điều đó chia tỷ lệ mọi thứ theo giá trị đó và chúng tôi cũng muốn xem kích thước tệp thực tế theo byte) .

[root@fedora17 blocksize]# ls -ls
total 8
0 -rw-r--r--. 1 root root    0 Jan 21 23:56 0_bytes.bin
4 -rw-r--r--. 1 root root    1 Jan 21 23:38 1_byte.bin
4 -rw-r--r--. 1 root root 4096 Jan 21 23:38 4096_bytes.bin

Hai điều có thể được lưu ý ở đây:

  • Tệp byte bằng 0 chiếm các khối không trong hệ thống tệp, xác nhận những gì Giles đã nêu .
  • Mặc dù hai tệp kia có kích thước tệp khác nhau, cả hai đều chiếm 4 * 1024 = một khối ext4 4KiB.

Tập tin thưa thớt

Các tệp thưa thớt là các tệp có các khối không lớn. Bởi vì dữ liệu được biết là không, nên không có điểm nào để lưu trữ trên đĩa. Theo cách này, kích thước rõ ràng của tệp thực sự có thể lớn hơn kích thước trên đĩa.

Dữ liệu nội tuyến

Lưu ý rằng một số hệ thống tập tin cho phép các nội dung rất file nhỏ để có thể lưu trữ trong các inode riêng của mình. Xem Có thể lưu trữ dữ liệu trực tiếp bên trong một nút trên hệ thống tệp Unix / Linux không? .


Có bạn khá chính xác, 4k là kích thước mà hệ thống tệp sử dụng để lưu trữ thông tin liên quan đến việc lưu trữ trong tệp hệ thống. Những thứ như chỉ mục của tệp từ đầu một khối, chỉ mục của khối và kích thước của bộ nhớ được sử dụng bởi tệp được lưu trữ lên tới 4k. Thông tin này được sử dụng để tham chiếu tệp văn bản từ hệ thống tệp.
pvn

2
Điều này là không đúng. Tệp siêu dữ liệu như bạn đề cập không "ăn hết" bất kỳ 4KiB nào. Những cấu trúc này là một phần của định dạng hệ thống tập tin. Xem câu trả lời của tôi ở trên để chứng minh. Nếu những gì bạn nói là đúng, thì tệp 4096 byte của tôi sẽ cần nhiều hơn một khối.
Jonathon Reinhart

Con trỏ tới tệp (phân đoạn không, blk no) trong hệ thống tệp là những thứ phải được lưu trữ và yêu cầu một khối được gán. Nếu tệp văn bản có rất ít nội dung có thể vừa với khối đầu tiên đã được gán cho nó, thì nó sẽ không yêu cầu phân bổ khối thứ hai. Tôi đồng ý rằng toàn bộ 4k không được sử dụng cho siêu dữ liệu và một số phân mảnh nội bộ phát sinh.
pvn

2
Tôi đang nói rằng không có kích thước khối 4 KiB nào được sử dụng cho siêu dữ liệu. Tôi nghĩ rằng ví dụ của tôi chứng minh điều đó.
Jonathon Reinhart

2
@pvn: Jonathon nói đúng. Siêu dữ liệu được lưu trữ trong inode cho tệp, tách biệt với khối được sử dụng để lưu trữ dữ liệu tệp.
Ốc cơ khí
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.