2009-09-30 105 views
1

好的,所以我目前正試圖在win2003服務器上調試一個問題。基本上我們有一個古老的程序,稱爲C的system()函數。現在我基本上追蹤到system()運行應用程序時的事實。該應用程序只能訪問大約500兆左右的內存。然而,如果我自己手動運行應用程序,它運行良好。系統C命令和內存限制?

系統命令和內存是否存在某種限制因素?

編輯

好了更詳細地說明。我們有一個自動處理系統,基本上需要一個輸入文件並在其上運行一堆應用程序。這在過去的12年中運行良好。但是現在我們正在使用ArcEngine(ESRI圖像處理)處理更大和更大的圖像(遙感)。現在我們基本上有以下幾種:

輸入文件進來 - >獲取處理系統 - >通過調用system()一個接一個地執行一組預定義的任務。

現在談到ESRI應用程序時,系統在嘗試將圖像讀入內存時崩潰了。我無法通過部分閱讀圖像文件來做任何事情,因爲這是他們的SDK工作原理。另外我只是通過創建一個veru簡單的C程序來進行測試,forcefullies分配內存並查看它何時崩潰。它幾乎恰好在512MB左右崩潰。我環顧四周,找不到任何東西。 =/...

EDIT 2

我只是做了一些時髦的測試。我基本上寫了一個小的C程序,通過system()調用應用程序。並稱之爲,它在同一個地方崩潰。當我打電話給這個程序時,系統有2.5GB可用內存(3個)。然後我基本上寫了一個使用子進程和popen的python腳本,它運行良好。將python腳本添加到自動處理系統也運行良好。

什麼可能做到這一點?

編輯3

Python腳本和處理系統都作爲同一個用戶運行。唯一的區別是處理系統作爲服務運行,以用戶身份登錄。

+0

請您詳細說明一下,是否只能訪問500MB內存而導致崩潰? – 2009-09-30 18:32:01

+0

你有沒有檢查過我提出的建議? – 2009-09-30 20:20:13

+0

python腳本是否以不同於C中程序的用戶身份運行? – 2009-09-30 20:31:11

回答

1

當在msdn上使用系統時,沒有提及任何內存限制對產生的進程。

系統調用返回哪個錯誤代碼?內存不足返回碼是ENOMEM (12)

但是需要注意的一點是,不建議使用系統,而是嘗試使用CreateProcess來運行它。

編輯:另一件要檢查的是在什麼permissionlevel這個應用程序正在執行。應用程序是否與您使用的用戶一樣運行?

編輯2:您可能還需要檢查Windows Job Objects,因爲它可用於限制給定作業組的內存使用情況。

2

你說程序運行良好,如果你手動運行它 - 在自動處理系統之外。您可以修改程序,以便在系統處理圖像時定期顯示可用內存量嗎?如果在首次調用SDK之前獲得可用內存值,則可以確定在處理映像時SDK使用了多少內存。如果結果超過512 MB(或任何您的限制),那麼您知道問題在於SDK需要的內存超過您的可用內存。

如果你不能進入圖像處理,你需要創建一個定時器proc,定期顯示可用內存的數量。