2009-09-30 68 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,定期显示可用内存的数量。