2009-03-03 20 views
5

Tôi có một tệp mở để viết và một quy trình chạy trong nhiều ngày - một thứ được ghi vào tệp trong những khoảnh khắc tương đối ngẫu nhiên. Sự hiểu biết của tôi là - cho đến khi tôi làm file.close() - có một cơ hội không có gì thực sự được lưu vào đĩa. Điều đó có đúng không?có COMMIT analog trong python để viết vào một tập tin?

Điều gì xảy ra nếu hệ thống gặp sự cố khi quá trình chính chưa kết thúc? Có cách nào để làm loại cam kết một lần ... nói - 10 phút (và tôi gọi cam kết này - không cần phải chạy hẹn giờ)? Là file.close() và mở (tập tin, 'a') cách duy nhất, hoặc có lựa chọn thay thế tốt hơn?

Trả lời

17

Bạn sẽ có thể sử dụng file.flush() để thực hiện việc này.

3

Nếu bạn không muốn giết quá trình hiện tại để thêm f.flush() (có vẻ như nó đã được chạy trong nhiều ngày rồi?), Bạn nên OK. Nếu bạn thấy các tập tin bạn đang viết để nhận được lớn hơn, bạn sẽ không mất dữ liệu ...

Từ tài liệu Python:

ghi (str) Viết một chuỗi các tập tin. Không có giá trị quay lại. Do đệm, chuỗi có thể không thực sự hiển thị trong tệp cho đến khi phương thức flush() hoặc close() được gọi.

Có vẻ như hệ thống đệm của Python sẽ tự động xóa các đối tượng tệp, nhưng nó không được đảm bảo khi điều đó xảy ra.

2

Để đảm bảo rằng dữ liệu của bạn được ghi vào đĩa, hãy sử dụng file.flush() theo sau là os.fsync(file.fileno()).

2

Như đã được tuyên bố sử dụng phương thức .flush() để buộc ghi ra khỏi bộ đệm, nhưng tránh sử dụng nhiều cuộc gọi để tuôn ra vì điều này thực sự có thể làm chậm quá trình ghi của bạn (nếu ứng dụng dựa vào ghi nhanh) vì bạn sẽ buộc hệ thống tệp của mình ghi các thay đổi nhỏ hơn kích thước bộ đệm có thể đưa bạn đến đầu gối của bạn. :)

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