2012-01-12 21 views
6

Tôi có 2 nhân viên Matlab độc lập, với dữ liệu nhận/tiết kiệm FIRST và SECOND đọc nó (và thực hiện một số phép tính, v.v.).Xác minh tệp .mat tồn tại và không bị hỏng - Matlab

FIRST lưu dữ liệu dưới dạng tệp .mat trên đĩa cứng trong khi SECOND đọc nó từ đó. Phải mất ~ 20 giây để SAVE dữ liệu này dưới dạng .mat và 8millisec đến DELETE. Trước khi SAVING dữ liệu, FIRST xóa tập tin cũ và sau đó lưu một phiên bản mới hơn.

Làm cách nào để SECOND xác minh dữ liệu đó tồn tại và is not corrupt? Tôi có thể sử dụng exists nhưng điều đó không cho tôi biết nếu dữ liệu bị hỏng hay không. Ví dụ: nếu SECOND cố đọc dữ liệu chính xác khi FIRST đang lưu dữ liệu, thì exists sẽ vượt qua nhưng LOAD sẽ báo lỗi cho bạn - Dữ liệu bị hỏng, v.v.

Cảm ơn.

+0

Bạn có đang sử dụng Hộp công cụ tính toán song song không? –

Trả lời

7

Bạn không có thể, nếu không có cơ chế đồng bộ - bởi lần thứ hai hoàn thành kiểm tra của nó và bắt đầu đọc tệp, FIRST có thể đã bắt đầu viết lại. Bạn cần một số loại khóa hoặc mutex.

Hai tùy chọn cho cơ sở Matlab.

Nếu đây là hệ thống tệp cục bộ, bạn có thể sử dụng tệp khóa riêng biệt bên cạnh tệp dữ liệu để quản lý quyền truy cập đồng thời vào tệp dữ liệu. Sử dụng các đối tượng FileChannel và FileLock của Java từ bên trong Matlab để khóa byte đầu tiên của tệp khóa và sử dụng nó như một semaphore để kiểm soát quyền truy cập vào tệp dữ liệu, do đó người đọc đợi cho đến khi người viết hoàn tất và ngược lại. (Nếu đây là hệ thống tập tin mạng, đừng thử điều này - khóa tệp có vẻ hoạt động nhưng thường không được hỗ trợ chính thức và trong kinh nghiệm của tôi không đáng tin cậy.)

Hoặc bạn có thể thử/nắm bắt xung quanh load() gọi và tạm dừng một vài giây và thử lại nếu bạn gặp lỗi tệp bị hỏng. Các định dạng tập tin .mat là như vậy mà bạn sẽ không nhận được một phần đọc nếu nhà văn vẫn viết nó; bạn sẽ nhận được lỗi tập tin bị hỏng. Vì vậy, bạn có thể sử dụng điều này như là một loại phát hiện va chạm lười biếng và backoff. Đây là những gì tôi thường làm.

Để giảm cửa sổ tranh chấp, hãy cân nhắc việc FIRST ghi vào một tệp tạm thời trong cùng một thư mục và sau đó sử dụng tên đổi để di chuyển đến đích cuối cùng. Bằng cách đó, tệp chỉ không khả dụng trong quá trình di chuyển hệ thống tệp nhanh, không phải 20 giây ghi dữ liệu. Nếu bạn có nhiều người viết, hãy gắn PID và tên máy chủ trong tên tệp tạm thời để tránh va chạm.

+0

Cảm ơn! Đề xuất # 2 và 3 đều hữu ích. Chỉ cần quản lý để đổi tên một tập tin bằng cách sử dụng toán tử 'dos' MATLAB. – Maddy

+0

bạn có thể đổi tên các tệp từ bên trong MATLAB bằng cách sử dụng lệnh 'movefile'. Không cần sử dụng DOS, điều này sẽ làm cho mã của bạn trở nên cụ thể. –

1

Âm thanh như sự cố chia sẻ tài nguyên cổ điển giữa 2 chủ đề (R-W)

Tóm lại, bạn nên tìm phương thức liên lạc an toàn giữa các nhân viên. Kiểm tra this out.

Ngoài ra, cố gắng gõ

showdemo ('paralleldemo_communic_prof')

trong Matlab

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