2013-08-07 33 views
11

Hệ thống tệp tiêu biểu và giao diện POSIX, chỉ cho phép thay đổi kích thước tệp ở cuối. Thông thường kích thước của một tập tin "trên đĩa" sau khi nó đã được đóng bằng với sự bù đắp của vị trí đọc/ghi khi nó được đóng lại. Tìm kiếm trước khi đóng cũng được gọi là "định vị lại phần cuối của tập tin."Hệ thống tệp nào cho phép định vị lại phần đầu của tệp?

Tệp chứa hàng đợi dữ liệu sẽ được trình bày hiệu quả hơn bằng cách loại bỏ phần đầu của tệp. Các khối phân bổ trên đĩa ngay từ đầu có thể được giải phóng và việc sao chép không cần thiết được giảm thiểu.

Điều này có được hỗ trợ trực tiếp bởi bất kỳ định dạng hệ thống tệp và/hoặc hệ điều hành chung nào không? Loại giao diện nào được sử dụng để làm như vậy? (Ví dụ, một bộ chọn Linux fcntl.) Tôi chắc chắn tôi đã nghe về loại điều này trong thực tế.

+2

Cận cảnh cử tri ... yêu cầu cho một API Linux cơ bản làm cho điều này là một "câu hỏi về lập trình." Nếu bạn cảm thấy không đủ về việc không thể trả lời, hãy đi chơi ở một nơi khác. – Potatoswatter

Trả lời

1

Thực ra, Linux không có giao diện thực hiện những gì bạn đang yêu cầu. Đó là cờ FALLOC_FL_COLLAPSE_RANGE để di dời. Nó được hỗ trợ bởi btrfs, ext4 và xfs (có thể là những người khác) trên các hạt nhân hiện đại. Mặc dù giao diện fallocate cho phép bạn chỉ định bù và độ dài byte, trong thực tế cuộc gọi COLLAPSE_RANGE sẽ chỉ hoạt động nếu độ lệch và chiều dài là bội số của kích thước khối hệ thống tệp.

Để biết thêm thông tin xin vui lòng xem hướng dẫn sử dụng mỹ cho fallocate (2) Hệ thống gọi: http://man7.org/linux/man-pages/man2/fallocate.2.html

+0

Cảm ơn! Cờ 'FALLOC_FL_PUNCH_HOLE' cũ hơn cũng giải quyết vấn đề thực tế, mặc dù không thay đổi độ lệch. Tôi đã không thử nó, nhưng manpage cho thấy nó đáng tin cậy làm việc với byte ngoài. – Potatoswatter

+0

Nó hoạt động với byte bằng cách zeroing chúng. Nếu bạn đang cố gắng giải phóng không gian trở lại hệ thống tập tin, nó sẽ chỉ làm điều này trong các khối 4k liên kết. –

1

Gần nhất tôi đã thấy là định dạng tệp cho biết dữ liệu đã bị "xóa" và sau đó không gian đã xóa có thể được sử dụng lại sau đó. Điều này thường chỉ hoạt động với các định dạng bản ghi có độ dài cố định chẳng hạn như DBF và yêu cầu bộ nhớ ít hơn để duy trì cả hai chỉ mục của các bản ghi đã xóa để sử dụng lại cũng như thứ tự các bản ghi trong tệp.

+0

Nếu các khối đã xóa có thể được xóa hoàn toàn, điều này cũng hiệu quả như đề xuất được đề xuất của OP vì Unix FSs có xu hướng sử dụng một biểu diễn thưa thớt, nơi các khối không được lưu trữ. –

+1

@larsmans: Thật không may khi chuyển một tệp không thưa thớt thành tệp thưa thớt không phải là rẻ, ngay cả khi các byte được đề cập đã bị xóa. –

4

Không. Không phải trong thế giới Unix, ở bất kỳ mức nào.

Nếu bạn nhìn vào bên trong hệ thống tệp nội bộ của DBMS hoặc Unix (ish), chúng có thể dễ dàng cắt bớt hoặc mở rộng bộ dữ liệu lúc đầu, ở cuối hoặc bất kỳ vị trí nào ở giữa. Nhưng họ không xuất khẩu chức năng đó; nó không phải là một phần của di sản API Unix hoặc tiêu chuẩn POSIX, do đó, bất kỳ API "cắt bớt lúc bắt đầu" hoặc "mở rộng lúc bắt đầu" nào sẽ không chuẩn ("độc quyền").

Tiện ích cận biên của các chức năng như vậy cũng không rõ ràng. Ai sẽ sử dụng chúng? Bao lau?

Tệp Unix (chuỗi các byte/ký tự bằng phẳng) đã chứng tỏ mình đơn giản và hiệu quả đối với mã ứng dụng, nhưng nền tảng kém cho cấu trúc dữ liệu lớp. Hai mươi lăm năm trước tuyên bố đó là gây tranh cãi; hôm nay nó chỉ là một thực tế lịch sử quan sát được.

Nhà phát triển Unix được sử dụng để tranh luận "tất cả mọi thứ có thể được giảm xuống tệp" và "chúng tôi có thể truy cập ngẫu nhiên thông qua tìm kiếm thông minh". Những tuyên bố không bao giờ khá làm việc ra, tuy nhiên. Ví dụ, Unix không phù hợp với khả năng quản lý bản ghi truy cập ngẫu nhiên của các hệ điều hành máy tính nhỏ và máy tính lớn (ví dụ: DEC RMS, IBM ISAM và VSAM). Và trong khi những người triển khai hệ thống tệp, hàng đợi, cố gắng, cơ sở dữ liệu quan hệ và cửa hàng đối tượng thỉnh thoảng thả nội dung vào tệp và họ sử dụng tệp cho các hoạt động tuần tự như ghi nhật ký, nhưng chúng hiếm khi phụ thuộc vào luồng ký tự làm định dạng cấp thấp của chúng. Thay vào đó, họ sử dụng các cấu trúc như cây B và bảng băm để quản lý trực tiếp các khối đĩa, phân đoạn bộ nhớ và các tài nguyên cơ bản khác.

Dòng ký tự thuộc về bảng, tài liệu và đối tượng - trừu tượng phù hợp cho ứng dụng của khách hàng. Nếu bạn muốn một hàng đợi, hãy cân nhắc việc sử dụng phần mềm trung gian hiện có (ví dụ: RabbitMQ, ZeroMQ, REDIS, một số trình quản lý DBMS) đã có điều này. Nếu bạn phải tự xây dựng nó, có thể bạn sẽ không xây dựng nó trên đỉnh một dòng trừu tượng hóa ký tự đơn giản. Vì vậy, trong khi cắt ngắn/mở rộng khi bắt đầu có khả năng hữu ích cho một số thứ (nhật ký cắt thay vì xoay vòng nhật ký được phân đoạn, ví dụ), nó không thể là Big Win cho hầu hết các triển khai cấu trúc dữ liệu.

1

Việc định vị lại phần đầu của tệp có lẽ không phải là một ý tưởng hay. Điều đó có thể gây nhầm lẫn cho các quá trình có các bộ mô tả tệp mở trên tệp đó và mong rằng nó có thể tìm kiếm chính xác, tức là có một khoảng bù có thể dự đoán được.

Nếu mục tiêu chính của bạn chỉ là để tiết kiệm dung lượng đĩa, có một số cách tiếp cận.

Nếu bạn có hỗ trợ ZFS và bật tính năng trùng lặp, các khối được sử dụng trước đây để lưu trữ dữ liệu ban đầu (hoặc bất kỳ phần nào thực sự) của tệp có thể được giải phóng bằng cách ghi đè chúng bằng số không.

Trong Linux, bạn cũng có thể giải phóng một phần lưu trữ tệp trong hệ thống tệp hỗ trợ tệp thưa thớt (hầu hết trong số chúng) bằng cách sử dụng cuộc gọi hệ thống fallocate và chuyển cờ FALLOC_FL_PUNCH_HOLE. Solaris cung cấp lệnh fcntl tương tự F_FREESP. Cho dù fallocate hoặc fcntl sẽ hoạt động hiệu quả hay hoàn toàn phụ thuộc vào việc triển khai thực hiện.

Hoặc, nếu bạn chạy một hệ điều hành không cung cấp chức năng fallocate hoặc tương đương nhưng hỗ trợ ZFS (ví dụ: FreeBSD) và/hoặc nếu không có sự lựa chọn vì bạn không có đủ RAM để dành cho nó, một thay thế nhẹ sẽ chỉ cho phép nén trên hệ thống tệp.

Các vấn đề liên quan