2014-02-17 105 views
1

我目前正在編寫代碼,使用Unix集羣上的節點來運行一系列耗時的實驗。這些實驗中的每一個都需要在12芯機器上運行3天。當每個實驗完成後,我希望能夠將一些數據保存到一個通用文件中。如何讓MATLAB的多個實例同時保存同一個文件

我有一個小問題,因爲我將所有實驗同時提交給羣集,因此它們很可能會同時保存到同一個文件中。

我在想,當MATLAB的多個實例試圖同時保存同一個文件(錯誤/崩潰/無)時會發生什麼。無論結果如何,我可以解決它使用一個try/catch循環如下:

n_tries = 0; 
while n_tries < 10 
    try 
     save('common_file',data) 
     n_tries = 10; 
    catch 
     wait_time = 60 * rand; 
     pause(wait_time); 
     n_tries = n_tries+1; 
     end 
    end 
end 
+2

就我個人而言,我建議不要這樣做。讓每個節點寫入一個獨特的文件,然後再添加一個腳本,將它們合併成一個文件會更安全。可以根據當前系統時間或計算機名稱給出該唯一文件的名稱。 – Lazarus

+0

** NOOOOOOOOOOO !!!! **不要這樣做! – Shai

回答

3

不要。

所有的Matlab函數都明確地使用而不是可以安全地在多線程/處理環境中使用。 如果從多個matlab會話中同時寫入一個mat文件,很可能會丟失幾個變量(因爲例如2個matlab附加到文件的相同狀態)或整個文件被損壞。

保存單個文件並在後處理步驟中合併它們。

+0

是的 - 你會花一些時間寫合併腳本(取決於結構),但它是值得的。同時保存一些未完成的數據是一個好主意(從經驗中) – Vairis

0

你會通過將單個記錄任務,做文件輸出和隊列的信息保存到該被最好的服務任務。

不要忘記,您提供給matlab的輸出「文件」只需要文件,如 - 即支持必要的方法。

3

對於如此長時間的模擬運行,除非擁有可靠的框架,否則不要自動聚合數據。原因有以下幾種:

  • 內存不足或寫入時出現類似情況可能會破壞以前的所有結果,這可能會在寫入大量數據時發生。
  • 編碼錯誤可能會破壞以前的結果。在發生衝突時,您的代碼至少會覆蓋最近添加的數據。
  • mex函數中的未檢測到的錯誤(通過隨機命中matlab地址空間而不是套住分段錯誤)會導致Matlab將廢話寫入Matfile並破壞以前的結果。

使用一些獨特的圖案,例如, pc-name +當前日期/時間

相關問題