2010-02-02 42 views
7

Dường như với tôi rằng một cách lưu trữ dữ liệu trong một cây B như một tệp có thể được thực hiện hiệu quả với C bằng cách sử dụng tệp nhị phân với một chuỗi (mảng) các cấu trúc, với mỗi cấu trúc biểu diễn một nút. Do đó, người ta có thể kết nối các nút riêng lẻ với cách tiếp cận sẽ tương tự như việc tạo danh sách được liên kết bằng cách sử dụng các mảng. Nhưng sau đó các vấn đề mà đạo cụ lên sẽ được xóa một nút, như erasing chỉ một vài byte ở giữa trong một tập tin rất lớn là không thể.C/C++: Làm thế nào để lưu trữ dữ liệu trong một tập tin trong cây B

Một cách xóa có thể là theo dõi các nút 'trống' cho đến khi đạt ngưỡng ngưỡng và sau đó tạo một tệp khác sẽ loại bỏ các nút trống. Nhưng điều này là tẻ nhạt.

Có cách nào tốt hơn từ quan điểm đơn giản/hiệu quả để xóa hoặc thậm chí là đại diện cho cây B trong tệp không?

TIA, -Sviiya

+0

Chỉ cần rõ ràng, bạn đang hỏi về cây B hay cây nhị phân. –

+0

B-cây. Nhưng tôi đoán với mục đích lưu trữ như các tập tin vấn đề sẽ giống nhau? – user203405

+0

BTW, C và C++ là hai ngôn ngữ khác nhau. Nếu bạn đang viết mã hoạt động trên cả hai, sau đó thêm thẻ C++. –

Trả lời

2

tôi đã tìm kiếm rất nhanh chóng và đào lên này: http://people.csail.mit.edu/jaffer/WB nguồn C: http://cvs.savannah.gnu.org/viewvc/wb/wb/c/ - có vẻ như để cung cấp B-cây cơ sở dữ liệu phong cách dựa trên đĩa - mặc dù tham gia một cái nhìn tại "xóa .c "nó dường như ngụ ý nếu bạn xóa một nút tất cả mọi thứ xuống từ nó sẽ được đưa ra - nếu đó là hành vi chính xác sau đó nó âm thanh như một cái gì đó có thể giúp đỡ?

Ngoài ra - B-cây thường được sử dụng trong các hệ thống tệp - bạn có thể không xem xét một số mã hệ thống tệp không?

Độ nghiêng của riêng tôi là hệ thống tệp - nếu bạn có một cây B có kích thước cố định, bất cứ khi nào bạn "xóa" nút thay vì tìm cách xóa tham chiếu, chỉ cần đặt giá trị thành bất kỳ giá trị nào trong mã của bạn. Sau đó, có một thread clean-up chạy để kiểm tra xem có ai mở tập tin để đọc hay không và liệu tất cả có chặn các tập tin và dọn dẹp không.

+0

Cảm ơn bạn đã tham khảo, Ninefingers. :) Chắc chắn sẽ phải đọc nó. Do việc xóa có thể xảy ra thường xuyên nên việc tính toán chúng sẽ hiệu quả. Tôi hy vọng một số hoạt động này có thể bị trì hoãn, nhưng tôi cần phải đọc mã để xem có lựa chọn nào tốt hơn không. Tôi cũng có ý định sử dụng nó cho một hệ thống tập tin sau đó, nhưng sau đó việc thực hiện sẽ khác nhau vì kích thước sẽ không đổi. Vì vậy, thiết kế sẽ cần phải tính đến điều đó. – user203405

+0

Hmm Tôi đồng ý. Mã đó tuyên bố để làm những gì bạn cần và một cái nhìn lướt qua ở chế độ xem cho thấy nó có thể - mà không cần ngồi xuống và xây dựng lại vấn đề của bạn mặc dù rất khó để nói ... Tôi nghĩ rằng hệ thống tập tin chỉ làm "không" phần tử mà họ muốn xóa và gán cho bất kỳ yếu tố không nhưng tôi có thể có sai. Dù bằng cách nào, nếu điều này không trả lời, vui lòng mở lại câu hỏi! –

+0

Các câu hỏi trả lời những gì tôi đang tìm kiếm và tôi đã phát hiện ra về việc cắt xén tệp và do đó vấn đề xóa dữ liệu từ giữa bị phá vỡ. Cảm ơn. :) – user203405

1

Bạn cũng có thể sử dụng Berkley DB. Nó hoạt động tốt với các chương trình C và thực hiện cây B +.

+0

Đúng, nhưng tôi muốn viết mã của riêng mình để có được cảm giác thật sự. :) – user203405

+0

Đồng ý. Viết trên của riêng bạn là tốt để có được cảm giác thực sự. BBD là cơ sở dữ liệu rất tinh vi và cung cấp nhiều tính năng mà mã bình thường sẽ không. Trong trường hợp triển khai sản phẩm thực tế, tôi sẽ chọn BDB. Tái phát minh bánh xe sẽ khó khăn ở đây. – Jack

4

Để triển khai B-Trees trong một tệp, bạn có thể sử dụng bù đắp tệp thay cho con trỏ. Ngoài ra, bạn có thể triển khai "trình quản lý bộ nhớ tệp" để bạn có thể sử dụng lại các mục đã xóa trong tệp.

Để khôi phục hoàn toàn các khối đã xóa trong tệp B-Tree, bạn sẽ phải tạo lại B-Tree trong một tệp mới. Cũng nên nhớ rằng hầu hết các hệ điều hành không có phương pháp để cắt bớt các tập tin. Một phương pháp di động để cắt ngắn một tập tin là viết một tập tin mới và phá hủy tập tin cũ.

Một đề xuất khác là phân vùng tệp thành phân vùng B-Tree và phân đoạn dữ liệu (mục). Một phân vùng B-Tree sẽ chứa các trang. Các trang lá sẽ chứa bù đắp cho các mục dữ liệu. Phân vùng dữ liệu sẽ là một phần trong tệp chứa các mục dữ liệu. Bạn có thể sẽ tạo ra nhiều hơn một phân vùng và các phân vùng có thể được xen kẽ.

Tôi đã dành nhiều thời gian chơi với một tệp dựa trên B-Tree, cho đến khi tôi từ bỏ và quyết định để cho một chương trình cơ sở dữ liệu (hoặc máy chủ) xử lý dữ liệu cho tôi.

+0

Âm thanh thú vị. Bài tập này của tôi là để có được một số tiếp xúc với mã hóa cấp thấp. Tôi chủ yếu quan tâm đến các hệ thống dựa trên Linux và nó hỗ trợ cắt ngắn tệp. :) – user203405

+0

Hầu hết các hệ điều hành * làm * có chức năng cắt bớt tệp. Trong Linux, BSD, Windows, bạn có thể đặt độ dài tập tin thành bất kỳ thứ gì bạn thích. –

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