python-016Đọc toàn bộ đề miễn phí

Ghi dữ liệu JSON an toàn chống hỏng file

Trong hệ thống lưu trữ checkpoint huấn luyện mô hình AI của AI Empire Academy, các file cấu hình và trọng số được ghi đè định kỳ. Nếu máy chủ mất điện hoặc tiến trình bị kill đúng…

PythonNâng cao30 phút

Tiến độ của tôi ở bài này

Điểm được lưu vào tài khoản sau khi chấm bài.

Đang tải điểm của bạn…

Kiến thức và chủ đề

file iojsonatomic writeos safetycontext manager

Kiến thức tiên quyết: file handling, json serialization, os module.

Nội dung đề bài

Mục tiêu kiến thức

  • Nắm vững rủi ro hỏng file (File Corruption) khi ghi trực tiếp bằng open(file, 'w').
  • Áp dụng mẫu thiết kế Atomic Write Pattern: ghi ra file tạm → flush() + fsync() → đổi tên nguyên tử bằng os.replace().
  • Đảm bảo an toàn dọn dẹp file tạm trong khối try-finally nếu quá trình serialize JSON gặp lỗi.

Mô tả bài toán

Trong hệ thống lưu trữ checkpoint huấn luyện mô hình AI của AI Empire Academy, các file cấu hình và trọng số được ghi đè định kỳ. Nếu máy chủ mất điện hoặc tiến trình bị kill đúng lúc đang thực hiện lệnh open(filepath, 'w').write(), file đích sẽ bị rỗng (0 bytes) hoặc bị hỏng dở dang, phá hủy vĩnh viễn cấu hình trước đó.

Để khắc phục, bạn hãy cài đặt hàm atomic_save_json(file_path: str, data: dict) -> bool thực hiện quy trình ghi nguyên tử:

  • Mở một file tạm thời trong cùng thư mục với file_path (để đảm bảo cùng filesystem, cho phép thao tác atomic rename).
  • Chuyển đổi data sang chuỗi JSON (hỗ trợ tiếng Việt ensure_ascii=False, thụt lề indent=2) và ghi vào file tạm.
  • Ép toàn bộ dữ liệu từ buffer của hệ điều hành xuống đĩa cứng vật lý bằng f.flush() và os.fsync(f.fileno()).
  • Thay thế file tạm vào file_path bằng os.replace().
  • Nếu quá trình thành công, hàm trả về True.
  • Nếu xảy ra lỗi (ví dụ: data chứa kiểu dữ liệu không serialize được như set, hoặc đường dẫn không hợp lệ):
  • Phải xóa bỏ file tạm đã tạo (nếu có).
  • Giữ nguyên file đích file_path ban đầu (nếu đã tồn tại).
  • Hàm trả về False (không làm sập chương trình).

Input

  • file_path: Đường dẫn file đích (str).
  • data: Từ điển dữ liệu cần ghi (dict).

Output

Trả về True nếu ghi thành công nguyên tử, ngược lại trả về False.

Ràng buộc

  • Thời gian chạy tối đa: 1000ms.
  • Giới hạn bộ nhớ: 256MB.

Ví dụ 1

Input

atomic_save_json('valid.json', {'name': 'AI Empire', 'version': 1})

Output

True

Giải thích

Hàm được gọi với các tham số mẫu trên và trả về kết quả chính xác theo yêu cầu.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.