2012-09-02 21 views
0

我從C#代碼運行過程中出現的SSIS包,像這樣:運行SSIS包從C#,並限制內存使用

ErrorHandler errorHandler = new ErrorHandler(); 
Application app = new Application(); 
DTSExecResult res; 
Package pkg = app.LoadPackage(packagePath, null); 
res = pkg.Execute(null, null, errorHandler, null, null); 

我有兩個問題:

  1. 什麼 「發動機」 運行這個包? SQL Server是否運行它,或者只需要一個較小的SSIS引擎。

  2. 當這個c#代碼(它是一個控制檯應用程序)運行很長時間後,它逐漸消耗越來越多的內存。我該如何限制正在運行的軟件包的內存使用情況?

*來考慮,這種行爲就像是SQL Server的行爲,即它佔用的內存和永遠不會釋放它,當然下定義的內存限制的一個想法。所以運行這個軟件包的「引擎」可能會隨着一定的內存限制而逐漸變得充滿。

回答

2

這是一些合理的推斷 - 但不準確。

  1. 運行包的「引擎」是您在C#應用程序中引用的庫。它與DTExec中的代碼相同 - 當您使用代理SSIS作業步驟時,該實用程序執行SSIS包(在SQL 2008R2及更低版本中)。 (SSIS2012在服務內部使用相同的代碼執行它們,而不是可執行文件。)不需要安裝SQL Server數據庫服務。您正在運行代碼的機器上需要完整的SQL Server許可證。所需的SQL安裝部分只是SSIS「共享」組件。
  2. 對於這個問題,我沒有很好的答案,因爲我自己也經歷過類似的問題,還沒有得到真正的答案。如果你看任務管理器,你會發現私人工作集(你的過程實際使用的內存量)始終保持合理。這是「承諾規模」,增長不合理。提交大小包括您的進程實際上未使用的內存,但Windows已分配給它。在我的情況下,運行一個包很長一段時間後(它有一個循環來處理大量文件),我可以看到Private Working set穩定在2GB,但看到Commit Size增長並增長到4GB以上,直到包失敗因爲它無法獲得記憶。我不明白這是爲什麼,因爲我的理解是,有很多內存爲我的流程保留,但實際上並未使用。我只能假設(沒有基礎)該過程在內部已經分割了內存。它必須在4GB內使用2GB「展開」,以便分散在內存塊周圍的空白空間太小而不能滿足任何請求。我不知道一個SSIS API調用「內存碎片整理」的內存:)

我可以建議的是,你創建你的包來限制自己。就我而言,通過一個循環,我可以實現一個「20循環最大值」,即使仍然有文件需要處理,程序包也只需在20個循環之後完成。返回值或數據庫表可能表示還有更多的處理尚未完成。在您的C#應用​​程序中,您可以將呼叫循環到pkg.Execute,可能會在該處嘗試一些GC。我不知道這是否足以觸發流程釋放所獲取的內存和/或連續重新分配內存,但這就是我想要的。