2015-11-04 103 views
0

我在我的web應用程序中運行了幾個角色。他們通過它們之間的Azure存儲隊列消息進行通信。這意味着在角色抓住它並開始執行之後,Web角色會放置消息。Azure Worker執行長時間運行操作失敗

主要是工作人員角色使用文件。它刪除xlsx文件中的所有空行。 工作人員迭代每行中的所有行和單元格。所以如果行內的所有單元格都是空的,我會刪除行

它適用於總行數少於100 000的文件,但我們的客戶加載的文件中有1 100 000條記錄(1 098 800個爲空)。所以當工人處理它失敗時。見附圖。

我附加調試器到這個過程。我的斷點在循環中首先發射了30-40秒。但是在調試器脫離後,我在Azure門戶中看到該消息,該工作人員不健康。

我也嘗試在單獨的線程中執行文件處理方法。但有同樣的結果。

任何想法?

enter image description here

UPDATE:

我的運行方法看起來像

public override void Run() { 
    var queue = GetCloudQueue(); 
    int maxJobRetries = 10; 
    while (true) { 
     try { 
      var msg = queue.GetMessage(); 

      if (msg != null) { 
       if (msg.DequeueCount <= maxJobRetries) { 
        ImportCommand ic = JsonConvert.DeserializeObject <ImportCommand> (msg.AsString); 
        ProcessImport(queue, msg); 
       } else { 
        queue.DeleteMessage(); 
       } 
      } else { 
       Thread.Sleep(100); 
      } 
     } catch (Exception ex) { 
      //handle exception 
     } 
    } 
} 

我真的不認爲有任何未處理的異常可以被拋出。我把所有的代碼放在try catch塊中。

我認爲值得一提的是我使用Gembox來解析xlsx文件。我的分析方法如下:

public IEnumerable <string[]> ReadLines(int sheetIndex) { 
    string[] data = null; 
    if (_file.Worksheets.Count > 0 && _file.Worksheets[sheetIndex].Rows.Count > 0) { 
     if (_headerLength == 0) { 
      _headerLength = _file.Worksheets[sheetIndex].Rows[0].AllocatedCells.Count; 
     } 
// I have great than 1 000 000 Rows 
     foreach(ExcelRow row in _file.Worksheets[sheetIndex].Rows) { 
      data = new string[_headerLength]; 
// I have 30 columns 
      for (int j = 0; j < _headerLength ; j++) { 
       ExcelCell cell = row.Cells[j]; 
       if (cell.Value != null) { 
        bool isDate = cell.Value is DateTime; 
        if (!isDate) { 
         data[j] = cell.Value.ToString(); 
        } else { 
         //if locale is null then used CurrentCulture (.net feature) 
         data[j] = ((DateTime) cell.Value).ToString(_locale); 
        } 
       } else { 
        data[j] = null; 
       } 
      } 
      yield return data; 
     } 
    } 
} 

更新2:

感謝David Makogon。 我改變了兩個尺寸(高達A2),現在它正在工作。但是我的記憶花了一分鐘。而且保留A2非常昂貴。任何想法如何減少我的代碼,使其在小實例上工作?

enter image description here

+0

最有可能你的角色,是因爲未處理的異常的循環。你能否包括你的角色的'OnStart'方法的代碼? –

回答

0

有沒有辦法跟你所提供的信息的點點診斷您的問題,除了一個小細節:你的Worker角色實例是A0,最小的,可能虛擬內存大小,搭配768MB RAM (和共享的CPU)。所以很有可能你的應用程序遇到了內存限制。

通常我會將此作爲評論發佈,但是您要處理的是百萬行xls文件,這聽起來像是一個非常耗費內存的任務,並且可以通過在較大的虛擬機上運行來解決。

相關問題