Quyền của Jerry, nếu chỉ là Ctrl-C bạn lo lắng, bạn có thể bỏ qua SIGINT cho các dấu chấm tại một thời điểm. Nếu bạn muốn được chứng minh chống lại cái chết quá trình nói chung, bạn cần một số loại journalling tối thiểu. Để trao đổi hai phần tử:
1) Thêm bản ghi vào cấu trúc điều khiển ở cuối tệp hoặc trong một tệp riêng biệt, cho biết hai phần tử của tệp bạn sẽ trao đổi, A và B.
2) Sao chép A vào khoảng trống đầu, ghi lại rằng bạn đã làm như vậy, tuôn ra.
3) Bản sao B qua A, sau đó ghi lại trong không gian đầu mà bạn đã làm như vậy, tuôn ra
4) Sao chép từ không gian đầu qua B.
5) Hủy bỏ các kỷ lục.
Đây là không gian phụ (O) cho tất cả các mục đích thực tế, do đó, vẫn được tính là tại chỗ theo hầu hết các định nghĩa. Trong lý thuyết ghi một chỉ số là O (log n) nếu n có thể được tùy ý lớn: trong thực tế nó là một log rất nhỏ n, và phần cứng hợp lý/thời gian chạy nó ở trên tại 64.
Trong mọi trường hợp khi tôi nói " tuôn ra ", tôi có nghĩa là cam kết những thay đổi" đủ xa ". Đôi khi hoạt động tuôn ra cơ bản của bạn chỉ xóa bộ đệm trong quá trình, nhưng nó không thực sự đồng bộ hóa môi trường vật lý, bởi vì nó không xóa bộ đệm tất cả các cách thông qua trình điều khiển thiết bị/mức phần cứng. Đó là đủ khi tất cả các bạn đang lo lắng về là quá trình chết, nhưng nếu bạn đang lo lắng về việc phá vỡ phương tiện truyền thông đột ngột sau đó bạn sẽ phải tuôn ra qua người lái xe. Nếu bạn lo lắng về mất điện, bạn phải đồng bộ hóa phần cứng, nhưng bạn thì không. Với một UPS hoặc nếu bạn nghĩ rằng cắt điện là rất hiếm bạn không nhớ mất dữ liệu, đó là tốt.
Khi khởi động, hãy kiểm tra khoảng trống cho bất kỳ bản ghi "hoán đổi" nào.Nếu bạn tìm thấy, hãy tìm hiểu xem bạn đã nhận được bao nhiêu và hoàn tất việc hoán đổi từ đó để đưa dữ liệu trở lại trạng thái âm thanh. Sau đó bắt đầu sắp xếp lại.
Rõ ràng là có vấn đề về hiệu suất ở đây, vì bạn đang ghi hai lần nhiều bản ghi như trước đây, đồng thời xóa/đồng bộ có thể tốn kém đáng kinh ngạc. Trong thực tế, sắp xếp tại chỗ của bạn có thể có một số thao tác di chuyển phức tạp, liên quan đến nhiều giao dịch hoán đổi, nhưng bạn có thể tối ưu hóa để tránh mọi phần tử chạm vào khoảng trống. Bạn phải đảm bảo rằng trước khi ghi đè lên bất kỳ dữ liệu nào, bạn có một bản sao của nó an toàn ở đâu đó và bản ghi nơi bản sao đó sẽ đi để đưa tệp của bạn trở lại trạng thái chứa chính xác một bản sao của từng phần tử.
Jerry cũng đúng là sắp xếp đúng chỗ tại chỗ quá khó và chậm cho hầu hết các mục đích thực tế. Nếu bạn có thể dành một số phần tuyến tính của kích thước tệp gốc làm không gian đầu, bạn sẽ có thời gian tốt hơn nhiều với một loại hợp nhất.
Dựa trên làm rõ của bạn, bạn sẽ không cần bất kỳ hoạt động tuôn ra nào ngay cả khi có sắp xếp tại chỗ. Bạn cần khoảng trống trong bộ nhớ hoạt động theo cách tương tự và trình xử lý SIGINT của bạn có thể truy cập để có được dữ liệu an toàn trước khi thoát, thay vì khôi phục khi khởi động sau khi thoát một lối thoát bất thường và bạn cần truy cập bộ nhớ đó theo cách an toàn bằng tín hiệu (về mặt kỹ thuật có nghĩa là sử dụng sig_atomic_t
để gắn cờ những thay đổi đã được thực hiện). Mặc dù vậy, bạn có thể tốt hơn với một mergesort hơn một loại thực sự tại chỗ.
Tôi nghĩ bạn phải hỏi Điều nào quan trọng hơn? Không gian, hoặc liệu quá trình có nên bị gián đoạn hay không.Nếu bạn cần đảm bảo tệp không bị hỏng, bạn sẽ cần phải theo dõi tiến trình của nó và các trạng thái trước đó bằng cách nào đó - điều này sẽ chiếm nhiều không gian hơn tệp. –
Để an toàn. Tạo một bản sao và sắp xếp bản sao. Tôi có thể; hình ảnh hệ thống tập tin sẽ gặp rắc rối với 40GB –
@Martin khác: trí tưởng tượng của bạn không hoạt động theo cách của tôi. Trên ổ đĩa chính của tôi, tôi hiện có 36,4 GB miễn phí. –