内存不足问题

时间:2021-08-09 06:14:58
我在写一个屏幕录像的软件
我先把截屏的照片放在本地硬盘中。然后 最后for把照片读取出来写入avi中。

但是如果照片过多的话 会导致内存不足。。   


我的代码

// al是个arrayList 里面放在图片存放的地址
for (int i = 0; i< al.Count;i++){
// 取出图片
Bitmap bm = new Bitmap(Image.FromFile(al[i].toString()));
添加帧 写入avi
aviWriter.AddFrame(bm);
}


19 个解决方案

#1


分段读取
不要一次性for循环所有

#2


引用 1 楼 q107770540 的回复:
分段读取
不要一次性for循环所有


怎么写

#3


感觉可能还是和你这个aviWriter的用法有关,就是需要在添加后面的图片时,前面的图片数据所占内存要被释放掉.

#4


所谓"内存不足"就是指在启动或运行DOS应用程序和Windows应用程序时,系统报"Out of
memory"或"内存不足"的错误信息。"内存不足"是一种很常见的故障,运行DOS应用程序和Windows应用程序引起"内存不足"的原因不完全相同。
一、DOS下的内存不足
如果是在运行DOS应用程序时出现" Out of memory"(内存不足)的故障,可按以下方法进行检查和处理:
1、检查系统是否提供对扩充内存的支持,必须保证CONFIG.SYS文件中的EMM386.EXE命令中含有RAM参数,关于RAM参数的设置请参考相关文章,这里就不述叙;
2、 如果故障仍存在,检查DOS内核程序与其它运行的应用程序是否兼容,某些程序是否占用了大量的常规内存,并作出相应的处理。
举个例子:一次我在运行WPS
时,屏幕显示"内存不够",系统无法运行。考虑到在运行WPS之前曾执行过一些其它程序,可能是这些程序没有完全从内存中退出,于是重新启动,运行金山汉字系统,WPS
编辑软件仍无法进入,用DOS
6.22的Mem命令查看内存,仅剩200KB左右的空间,且CHLIB文件占用主内存达255KB,即字库放在了常规内存中,而金山系统是应该可以自动使用扩展内存存放字库的,查看系统配置情况,在CONFIG.SYS中设有:
DEVICE=C:\DOS\HIMEM.SYS
DOS=HIGH
这就是说,DOS内核程序调入扩展内存后,虽然扩大了可用主内存空间,但是由于扩展内存与金山系统发生冲突,以致汉字库无法载入扩展内存。解决的办法有两种:
1、去掉DOS=HIGH设置,将DOS内核程序从扩展内存撤出,即可正常运行。
2、将"/DEVICE=C:\DOS\HIMEM.SYS"改为"/DEVICE=C:\DOS\HIMEM.SYS/INT15=320",因金山系统使用的是扩展内存的低端,这一区域若有其它程序驻留,字库就不能正常载入,利用INT15参数给系统先预留出一部分传统的扩展存储器(即不由XMS规范管理而由INT15直接使用的扩展存储器),字库和DOS内核都可使用扩展内存了,这样设置之后,在金山汉字系统状态下可用的主内存空间可达512KB,比不设置时多出250KB左右。
二、Windows中的内存不足
如果在运行Windows应用程序时,出现"内存不足"的故障,可按下列方法进行检查和处理:
1、首先应检查Windows的资源使用情况,如果资源占用较多,可用资源较少,打开新文件时会出现"内存不足"的问题。这时可以清理屏幕,减少窗口的数目,关闭不用的应用程序,包括TSR内存驻留程序,将Windows应用程序最小化为图标,如果问题只是在运行一特殊的应用程序时出现,则与应用软件销售商联系,可能是数据对象的管理不好所致;
2、如果问题没有解决,清除或保存Clipboard(剪贴板)的内容,使用ControlPanel
Desktop选项将墙纸(Wallpaper)设置为None;
3、如问题仍存在,可用PIF编辑器编辑PIF文件,增大PIF文件中定义的MemoryRequirements:KB
Required的值;在标准模式下,选择Prevent
ProgramSwitch,该开关选项打开后,退出应用程序返回Windows;如果是386增强模式,则要将Display
Usage设置成Full Screen(全屏幕方式),将Execution设置为Exclusive,将Video
memory设置为尽可能低的方式;
4、
如果问题仍存在,则重新开机进入Windows系统,并且确保在"启动"图标中没有其它无关的应用软件同时启动运行,在WIN.INI文件中也没有Run或Load命令加载的任何无关的应用程序。
在平时,出现"内存不足"的问题一般可以按以下办法处理。
首先,退出那些不需要运行的应用程序,然后,再检查系统的可用资源为多少。如果可用资源大于30%,一般可以运行新的程序。当有多个应用程序在系统中运行时,可以退出一个,检查一次可用资源,如果某个应用程序在退出前后,可用资源的百分比没有变化,说明这个应用程序没有释放它所占用的资源。如果要收回这些没有释放的资源,只能退出Windows后,再重新进入Windows。为了确保在启动进入Windows时系统的可用资源足够,在"启动"图标中应该没有无关的应用软件同时启动运行,在WIN.INI文件中也没有由Run或Load命令加载的任何无关的应用程序,因为这些同时启动的无关应用程序可能已经占用了很多资源,使得要使用的应用程序无法运行。
一般说来,经过这样处理,就不会出现"内存不足"的问题了

#5


 http://www.jxcad.com.cn/topic_1072594.html

#6


引用 2 楼 didiaogao 的回复:
引用 1 楼 q107770540 的回复:
分段读取
不要一次性for循环所有


怎么写





int m=al.Count;

  while(m>10)//我设置是每次读取10张,具体多少你自己看着办
{
  // al是个arrayList 里面放在图片存放的地址
for (int i = 0; i<10;i++){
// 取出图片
Bitmap bm = new Bitmap(Image.FromFile(al[i].toString()));
添加帧 写入avi
aviWriter.AddFrame(bm);
}
 m-=10;
}
if(m>0)

// al是个arrayList 里面放在图片存放的地址
for (int i = 0; i<m;i++){
// 取出图片
Bitmap bm = new Bitmap(Image.FromFile(al[i].toString()));
添加帧 写入avi
aviWriter.AddFrame(bm);
}
}

#7


引用楼主 didiaogao 的回复:
我在写一个屏幕录像的软件
我先把截屏的照片放在本地硬盘中。然后 最后for把照片读取出来写入avi中。

但是如果照片过多的话 会导致内存不足。。  


我的代码

C# code

// al是个arrayList 里面放在图片存放的地址
for (int i = 0; i< al.Count;i++){
// 取出图片
Bitmap bm = new Bitmap(……

可否采用分批读取、分批写入的方式?
比如每次读取100张左右的图片,添加进去之后就将当前AVI的输入写入到文件中完成之后清空内存区,下次再读取100张图片,添加进去之后再将视频数据追加到文件中然后清空内存区,一直循环下去直至结束。

#8


ps:

 m-=10;
后添加
Thread.Sleep(2000); //每读取10张让进程sleep 2 秒

#9


每天评论一条,你好我好大家好

#10


专业接分 ……

#11


没分了..

#12


-----------------------

#13


这个很强大啊``

#14


分批读取吧。

#15


bm没有释放

#16


可能要释放内存吧

#17


已经解决了

#18


该回复于2011-03-16 10:10:45被版主删除

#19


纠结,怎么解决系统内不足?

#1


分段读取
不要一次性for循环所有

#2


引用 1 楼 q107770540 的回复:
分段读取
不要一次性for循环所有


怎么写

#3


感觉可能还是和你这个aviWriter的用法有关,就是需要在添加后面的图片时,前面的图片数据所占内存要被释放掉.

#4


所谓"内存不足"就是指在启动或运行DOS应用程序和Windows应用程序时,系统报"Out of
memory"或"内存不足"的错误信息。"内存不足"是一种很常见的故障,运行DOS应用程序和Windows应用程序引起"内存不足"的原因不完全相同。
一、DOS下的内存不足
如果是在运行DOS应用程序时出现" Out of memory"(内存不足)的故障,可按以下方法进行检查和处理:
1、检查系统是否提供对扩充内存的支持,必须保证CONFIG.SYS文件中的EMM386.EXE命令中含有RAM参数,关于RAM参数的设置请参考相关文章,这里就不述叙;
2、 如果故障仍存在,检查DOS内核程序与其它运行的应用程序是否兼容,某些程序是否占用了大量的常规内存,并作出相应的处理。
举个例子:一次我在运行WPS
时,屏幕显示"内存不够",系统无法运行。考虑到在运行WPS之前曾执行过一些其它程序,可能是这些程序没有完全从内存中退出,于是重新启动,运行金山汉字系统,WPS
编辑软件仍无法进入,用DOS
6.22的Mem命令查看内存,仅剩200KB左右的空间,且CHLIB文件占用主内存达255KB,即字库放在了常规内存中,而金山系统是应该可以自动使用扩展内存存放字库的,查看系统配置情况,在CONFIG.SYS中设有:
DEVICE=C:\DOS\HIMEM.SYS
DOS=HIGH
这就是说,DOS内核程序调入扩展内存后,虽然扩大了可用主内存空间,但是由于扩展内存与金山系统发生冲突,以致汉字库无法载入扩展内存。解决的办法有两种:
1、去掉DOS=HIGH设置,将DOS内核程序从扩展内存撤出,即可正常运行。
2、将"/DEVICE=C:\DOS\HIMEM.SYS"改为"/DEVICE=C:\DOS\HIMEM.SYS/INT15=320",因金山系统使用的是扩展内存的低端,这一区域若有其它程序驻留,字库就不能正常载入,利用INT15参数给系统先预留出一部分传统的扩展存储器(即不由XMS规范管理而由INT15直接使用的扩展存储器),字库和DOS内核都可使用扩展内存了,这样设置之后,在金山汉字系统状态下可用的主内存空间可达512KB,比不设置时多出250KB左右。
二、Windows中的内存不足
如果在运行Windows应用程序时,出现"内存不足"的故障,可按下列方法进行检查和处理:
1、首先应检查Windows的资源使用情况,如果资源占用较多,可用资源较少,打开新文件时会出现"内存不足"的问题。这时可以清理屏幕,减少窗口的数目,关闭不用的应用程序,包括TSR内存驻留程序,将Windows应用程序最小化为图标,如果问题只是在运行一特殊的应用程序时出现,则与应用软件销售商联系,可能是数据对象的管理不好所致;
2、如果问题没有解决,清除或保存Clipboard(剪贴板)的内容,使用ControlPanel
Desktop选项将墙纸(Wallpaper)设置为None;
3、如问题仍存在,可用PIF编辑器编辑PIF文件,增大PIF文件中定义的MemoryRequirements:KB
Required的值;在标准模式下,选择Prevent
ProgramSwitch,该开关选项打开后,退出应用程序返回Windows;如果是386增强模式,则要将Display
Usage设置成Full Screen(全屏幕方式),将Execution设置为Exclusive,将Video
memory设置为尽可能低的方式;
4、
如果问题仍存在,则重新开机进入Windows系统,并且确保在"启动"图标中没有其它无关的应用软件同时启动运行,在WIN.INI文件中也没有Run或Load命令加载的任何无关的应用程序。
在平时,出现"内存不足"的问题一般可以按以下办法处理。
首先,退出那些不需要运行的应用程序,然后,再检查系统的可用资源为多少。如果可用资源大于30%,一般可以运行新的程序。当有多个应用程序在系统中运行时,可以退出一个,检查一次可用资源,如果某个应用程序在退出前后,可用资源的百分比没有变化,说明这个应用程序没有释放它所占用的资源。如果要收回这些没有释放的资源,只能退出Windows后,再重新进入Windows。为了确保在启动进入Windows时系统的可用资源足够,在"启动"图标中应该没有无关的应用软件同时启动运行,在WIN.INI文件中也没有由Run或Load命令加载的任何无关的应用程序,因为这些同时启动的无关应用程序可能已经占用了很多资源,使得要使用的应用程序无法运行。
一般说来,经过这样处理,就不会出现"内存不足"的问题了

#5


 http://www.jxcad.com.cn/topic_1072594.html

#6


引用 2 楼 didiaogao 的回复:
引用 1 楼 q107770540 的回复:
分段读取
不要一次性for循环所有


怎么写





int m=al.Count;

  while(m>10)//我设置是每次读取10张,具体多少你自己看着办
{
  // al是个arrayList 里面放在图片存放的地址
for (int i = 0; i<10;i++){
// 取出图片
Bitmap bm = new Bitmap(Image.FromFile(al[i].toString()));
添加帧 写入avi
aviWriter.AddFrame(bm);
}
 m-=10;
}
if(m>0)

// al是个arrayList 里面放在图片存放的地址
for (int i = 0; i<m;i++){
// 取出图片
Bitmap bm = new Bitmap(Image.FromFile(al[i].toString()));
添加帧 写入avi
aviWriter.AddFrame(bm);
}
}

#7


引用楼主 didiaogao 的回复:
我在写一个屏幕录像的软件
我先把截屏的照片放在本地硬盘中。然后 最后for把照片读取出来写入avi中。

但是如果照片过多的话 会导致内存不足。。  


我的代码

C# code

// al是个arrayList 里面放在图片存放的地址
for (int i = 0; i< al.Count;i++){
// 取出图片
Bitmap bm = new Bitmap(……

可否采用分批读取、分批写入的方式?
比如每次读取100张左右的图片,添加进去之后就将当前AVI的输入写入到文件中完成之后清空内存区,下次再读取100张图片,添加进去之后再将视频数据追加到文件中然后清空内存区,一直循环下去直至结束。

#8


ps:

 m-=10;
后添加
Thread.Sleep(2000); //每读取10张让进程sleep 2 秒

#9


每天评论一条,你好我好大家好

#10


专业接分 ……

#11


没分了..

#12


-----------------------

#13


这个很强大啊``

#14


分批读取吧。

#15


bm没有释放

#16


可能要释放内存吧

#17


已经解决了

#18


该回复于2011-03-16 10:10:45被版主删除

#19


纠结,怎么解决系统内不足?

#20