2012-01-12 239 views
6

我有2名獨立的Matlab的工人,先取/保存數據讀和二讀它(和做一些計算等)。驗證.MAT文件存在並且未損壞 - Matlab的

首先保存數據的硬盤,而第二從那裏讀取它.MAT文件。這個數據需要大約20秒到SAVE這個數據爲.mat和8millisec到DELETE它。在保存數據之前,FIRST刪除舊文件,然後保存更新的版本。

第二如何可以驗證數據是否存在以及is not corrupt?我可以使用exists,但不會告訴我數據是否損壞。例如,如果SECOND嘗試在FIRST保存時讀取數據,exists會通過,但LOAD會給出錯誤 - 數據損壞等。

謝謝。

+0

您使用的是並行計算工具箱? – 2012-01-12 18:16:44

回答

7

你不能,沒有一些同步機制 - 由時間秒鐘內完成其檢查並開始讀取文件,FIRST可能已經開始再次寫入。你需要某種鎖或互斥體。

兩個選項爲基礎Matlab的。

如果這是一個本地文件系統,你可以使用一個單獨的鎖文件坐在旁邊的數據文件來管理數據文件的併發訪問。在Matlab中使用Java的NIO FileChannel和FileLock對象鎖定鎖定文件的第一個字節,並將其用作信號量來控制對數據文件的訪問,以便讀者等待寫入完成,反之亦然。 (如果這是在網絡文件系統上,請不要嘗試這樣做 - 文件鎖定似乎可以正常工作,但通常沒有官方支持,並且根據我的經驗是不可靠的。)

或者您可以在您的周圍放一個try/catch請撥打load()並讓它暫停幾秒鐘,如果發生損壞的文件錯誤,請重試。 .mat文件格式是這樣的:如果作者仍在寫它,你將不會得到部分讀取;你會得到那個損壞的文件錯誤。所以你可以使用它作爲一種懶惰的碰撞檢測和退避。這是我通常做的。

要減少爭用窗口,請考慮先寫入到同一目錄中的臨時文件,然後使用重命名將其移至其最終目標。這樣該文件僅在快速文件系統移動操作期間不可用,而不是20秒的數據寫入。如果您有多個寫入程序,請將PID和主機名粘貼在臨時文件名中以避免衝突。

+0

謝謝!建議#2和3都有幫助。只是設法使用matlab'dos'運算符重命名一個文件。 – Maddy 2012-01-12 22:50:30

+0

你可以使用'movefile'命令從matlab中重命名文件。不需要使用DOS,這將使您的代碼特定於平臺。 – 2013-11-23 23:59:44

1

聽起來像是2個線程(R-W)

總之之間的經典資源共享的問題,你應該找間工人的方法安全通信。檢查this out

此外,嘗試鍵入

showdemo( 'paralleldemo_communic_prof')

在Matlab