VB6应用程序内存不足错误

VB6应用程序内存不足错误,vb6,Vb6,在任何人说这句话之前,我知道这不是应该做的方式,但这是它做的方式,我正在努力支持它,而不是重写所有内容。 我可以向你保证,这不是目前为止最糟糕的一点 当应用程序将整个文件读入字符串变量时,就会出现问题。 正常情况下,这可以正常工作,因为文件很小,但是一个用户创建了一个107MB的文件,这就失败了 intFreeFile = FreeFile Open strFilename For Binary Access Read As intFreeFile ReadFile = String(LOF(i

在任何人说这句话之前,我知道这不是应该做的方式,但这是它做的方式,我正在努力支持它,而不是重写所有内容。
我可以向你保证,这不是目前为止最糟糕的一点

当应用程序将整个文件读入字符串变量时,就会出现问题。 正常情况下,这可以正常工作,因为文件很小,但是一个用户创建了一个107MB的文件,这就失败了

intFreeFile = FreeFile
Open strFilename For Binary Access Read As intFreeFile
ReadFile = String(LOF(intFreeFile), " ")
Get intFreeFile, , ReadFile
Close intFreeFile
现在,它不会在线路上掉下来

ReadFile = String(LOF(intFreeFile), " ")
但是在

Get intFreeFile, , ReadFile
那么这里发生了什么,肯定是字符串完成了内存分配,那么为什么它会抱怨Get上的内存不足?

您不需要“Get”调用,只需删除它,您已经将文件放入字符串中,因此不需要使用Get调用

ReadFile = Input(LOF(intFreeFile), intFreeFile)
您不需要“GET”调用,只需删除它,您已经将文件放入字符串中,因此不需要使用GET调用

ReadFile = Input(LOF(intFreeFile), intFreeFile)

通常读取文件需要一些缓冲,这会占用空间。我在这里猜测,但我要看看字节到字符转换所需的空间。VB6字符串为16位,但(二进制)文件为8位。文件内容需要107MB,转换结果需要214MB。字符串分配只保留214MB。

通常读取文件需要一些缓冲,这会占用空间。我在这里猜测,但我要看看字节到字符转换所需的空间。VB6字符串为16位,但(二进制)文件为8位。文件内容需要107MB,转换结果需要214MB。字符串分配只保留214MB。

我收到了相同的错误。我们刚刚检查了taskmanager,它显示了100%的资源使用率。我们发现其中一个更新应用程序占用了太多的ram内存,于是我们将其杀死。 这为我解决了这个问题。还有一件事是我们进入了配置设置。 开始->运行->配置
然后转到“启动”选项卡,取消选中看起来像更新程序应用程序的应用程序或不使用的奇怪应用程序。

我遇到了相同的错误。我们刚刚检查了taskmanager,它显示了100%的资源使用率。我们发现其中一个更新应用程序占用了太多的ram内存,于是我们将其杀死。 这为我解决了这个问题。还有一件事是我们进入了配置设置。 开始->运行->配置
然后转到“启动”选项卡,取消选中看起来像更新程序应用程序的应用程序或不使用的奇怪应用程序。

行ReadFile=String(LOF(intFreeFile),“”)只分配一个长度为LOF(intFreeFile)的字符串并用空格填充。我们仍然需要GET将文件内容读取到字符串中。ReadFile=string(LOF(intFreeFile),“”)行只分配一个长度为LOF(intFreeFile)的字符串并用空格填充。我们仍然需要GET将文件的内容读入字符串。该文件是一大块XML。大部分空间都是XML化的图像。不过我会调查你说的话。@kenneedham:听起来像是说“对不起,我们不支持那个”是合理的。或者添加一个特殊情况,如果文件太大,一次加载一个字节。(实际的磁盘I/O仍将由操作系统进行缓冲;您不会得到1亿个物理I/O)。虽然公平地说,这并不是用户的错。如果应用程序允许他们这样做,那么它应该可以工作。在这种情况下,它允许用户下载数据,但在修改空间数据后不再上传数据。整个过程都需要重写,但我相信如果我提出这个建议,我们都知道答案。如果没有看到更多的代码,就很难说需要重写的范围有多广。不过,64K数据块的读取和处理将大大提高可伸缩性。这就是为什么“把所有的东西都塞进RAM,文件都很小”甚至不应该在一次性程序中完成的原因:坏习惯的形成让你在紧要关头失望。我们遇到了这样的情况,编码人员试图将XML DOM用于所有事情。他们不知道如何使用SAX解析器。通常我们不会续签他们的合同,更不用说让他们开始编写服务器端代码了。事实上,我已经把它改成了一小块一小块地处理,这样VB端的东西现在就可以工作了。但是,服务器端Java代码(由同一家大型知名公司编写)现在出现内存不足异常。我认为是时候告诉用户不要尝试加载这么大的数据集了。这个文件是一大块XML。大部分空间都是XML化的图像。不过我会调查你说的话。@kenneedham:听起来像是说“对不起,我们不支持那个”是合理的。或者添加一个特殊情况,如果文件太大,一次加载一个字节。(实际的磁盘I/O仍将由操作系统进行缓冲;您不会得到1亿个物理I/O)。虽然公平地说,这并不是用户的错。如果应用程序允许他们这样做,那么它应该可以工作。在这种情况下,它允许用户下载数据,但在修改空间数据后不再上传数据。整个过程都需要重写,但我相信如果我提出这个建议,我们都知道答案。如果没有看到更多的代码,就很难说需要重写的范围有多广。不过,64K数据块的读取和处理将大大提高可伸缩性。这就是为什么“把所有的东西都塞进RAM,文件都很小”甚至不应该在一次性程序中完成的原因:坏习惯的形成让你在紧要关头失望。我们遇到了这样的情况,编码人员试图将XML DOM用于所有事情。他们不知道如何使用SAX解析器。通常我们不会续签他们的合同,更不用说让他们开始编写服务器端代码了。事实上,我已经把它改成了一小块一小块地处理,这样VB端的东西现在就可以工作了。但是,服务器端Java代码(由同一家大型知名公司编写)现在出现内存不足异常。我