内存不断增加问题 在线等 急~~~~

lxlchj_0303 2009-12-24 09:59:15
void WriteBinaryDataToField(FieldPtr Field,ZMemStream* Stream)
{
char* pBuf = (char*)Stream->GetBuffer();
int BufSize = Stream->GetSize();
if(pBuf)
{
VARIANT varBLOB;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound = {BufSize,0};
psa = SafeArrayCreate(VT_UI1, 1, &rgsabound);
for (long i = 0; i < (long)BufSize; i++)
SafeArrayPutElement (psa, &i, &pBuf[i]);
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa;
Field->AppendChunk(varBLOB);
SafeArrayDestroy(psa);
pBuf = NULL;
}
}
在存储数据时没有错,但在存储图像时内存不断在增加 ,尤其是在AppendChunk后,安全数组我释放了,但是内存还是在增加,帮忙看看~~~~
...全文
261 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxlchj_0303 2009-12-25
  • 打赏
  • 举报
回复
不管oracle还是MSSQL,其实在这块不重要,他们里面的应用方式是一样的,就提到我这块的问题是不用管用的什么数据库的。前段时间我们用的是SQL2000,只是最近才换成oracle。
aimee_99 2009-12-25
  • 打赏
  • 举报
回复
.
--小F-- 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lxlchj_0303 的回复:]
顺便说一下我用的是oracle数据库,目前问题还是没有解决 ,郁闷中!!!!!!!!!
[/Quote]

建议去相应版块问问
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lxlchj_0303 的回复:]
顺便说一下我用的是oracle数据库,目前问题还是没有解决 ,郁闷中!!!!!!!!!
[/Quote]
你用oracle的话,放到oracle版,这里是MSSQL
jinsenhome 2009-12-25
  • 打赏
  • 举报
回复
学习中
guguda2008 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lxlchj_0303 的回复:]
顺便说一下我用的是oracle数据库,目前问题还是没有解决 ,郁闷中!!!!!!!!!
[/Quote]
所有人都被你玩了
lxlchj_0303 2009-12-25
  • 打赏
  • 举报
回复
顺便说一下我用的是oracle数据库,目前问题还是没有解决 ,郁闷中!!!!!!!!!
lxlchj_0303 2009-12-25
  • 打赏
  • 举报
回复
来个人帮帮忙,我感觉是安全数组和AppendChunk这两个所引起的,另外我在AppendChunk之后VariantClear(&varBLOB)内存减少了但释放SafeArrayDestroy内存不减少了,具体是那块引起的问题我还无法求证,希望好心人高手们来帮帮忙,和用哪种数据库无关。
lxlchj_0303 2009-12-24
  • 打赏
  • 举报
回复
快来人帮帮忙啊,郁闷!!!
menggang9801 2009-12-24
  • 打赏
  • 举报
回复
关注一下
lxlchj_0303 2009-12-24
  • 打赏
  • 举报
回复
楼上的 怎么去释放啊 ,我找勒N久也没有找到解决办法。
WuSeeBin 2009-12-24
  • 打赏
  • 举报
回复
Field->AppendChunk(varBLOB);
相当于一个COM组件指针,每执行一次Field->AppendChunk(varBLOB);内存肯定会增加,你要执行后,要释放一下。
dawugui 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lxlchj_0303 的回复:]
你是说把数据库的最大内存设置下九可以勒么,但是在执行上万条记录后,计算机内存就不足了,也写不进去数据了。
[/Quote]
还有,把计算机虚拟内存加大.以你的C盘空间(硬盘空间大小适当加大)

解决SQL Server虚拟内存不足情况
ZDNet 软件频道 更新时间:2007-11-19 作者:21tx 来源:21tx
本文关键词:数据库 内存 虚拟 SQL Server
  症状

  在具有 2 GB 或更多 RAM 的计算机上,除了 256 MB (SQL Server7.0) 或 384 MB (SQL Server 2000) 虚拟地址空间之外,SQL Server 在启动过程中保留剩下的所有虚拟地址空间以供缓冲池使用。另外,为了存储数据和过程缓存,SQL Server 使用缓冲池内存为来自 SQL Server 进程的大多数小于 8 KB 的其他内存请求提供服务。剩下的未保留内存准备用于不能从缓冲池得到服务的其他分配。这些分配包括、但不限于以下各项: ?SQL Server 创建的所有线程的堆栈和关联的线程环境块。在 SQL Server 创建了所有 255 个工作线程之后,这大约为 140 MB。

  由在 SQL Server 地址空间(根据具体系统而有所不同)中运行的其他 DLL 或进程进行的分配,如: ?任何链接的服务器中的 OLE DB 提供程序。

  通过使用 sp_OA 系统存储过程或扩展存储过程加载的 COM 对象。

  加载到地址空间中的任何映像(.exe 或 .dll),这些映像通常使用 20 到 25 MB,但是如果您使用链接的服务器、sp_OA 或扩展存储过程,则这些映像可能使用更多的空间。

  进程堆和 SQL Server 可能创建的任何其他堆。在启动过程中,此空间通常为 10 MB,但是如果您使用链接的服务器、sp_OA 或扩展存储过程,则此空间可能更多。

  来自 SQL Server 进程的大于 8 KB 的分配,例如较大查询计划、网络数据包大小配置选项接近于 8 KB 时发送和接收缓冲区等情况所需要的分配。要查看此数字,请查找在 DBCC MEMORYSTATUS 中报告的 OS Reserved 值,该值是作为 8 KB 页的数目报告的。通常,该值为 5 MB。

  跟踪缓冲池中每个缓冲区状态信息的数组。该值通常约为 20 MB,除非 SQL Server 运行时启用了地址窗口化扩展插件 (AWE),在这种情况下,该值将会显著提高。

  在拥有大量数据库的系统上,日志格式化所需的 64 KB 分配可能会占用所有剩余的虚拟内存。这之后的分配将失败,导致本文的“症状”一节中列出的一个或多个错误。

  通过使用 -g 启动参数,您可以指示 SQL Server 保留附加的虚拟内存可用,以便这些与日志相关的分配和其他正常分配加在一起也不会用完虚拟地址空间。

  下表根据数据库的数目和服务器版本列出 -g 值的一些建议初始值: DatabasesSQL Server 7.0SQL Server 2000

  250-g134N/A

  500-g185N/A

  750-g237N/A

  1000-g288-g288

  1250-g340-g340

  1500-g392-g392

  此表是使用列出的典型值进行计算的,并且此计算是基于没有使用链接的服务器活动、sp_OA 或扩展存储过程这一假设的。它还假设您没有使用 AWE 和 SQL 事件探查器。出现以上任意一种情况都需要您增加 -g 的值。

  如果服务器上数据库的数目超过此数目,Microsoft 建议您在运行该服务器之前进行慎重的考虑,因为系统上具有如此数目的数据库所需的系统开销将占用缓冲池中的大量虚拟内存,从而可能导致系统整体性能下降。
lxlchj_0303 2009-12-24
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20050118/09/3733663.html
和这位仁兄一样的问题,我也在怀疑是不是安全数组,但安全数组释放后内存确实减少了,但AppendChunk增加的内存怎么解决啊。
lxlchj_0303 2009-12-24
  • 打赏
  • 举报
回复
你是说把数据库的最大内存设置下九可以勒么,但是在执行上万条记录后,计算机内存就不足了,也写不进去数据了。
dawugui 2009-12-24
  • 打赏
  • 举报
回复
SQL Server占用过多内存的问题
ZDNet 软件频道 更新时间:2007-11-23 作者:赛迪网 来源:赛迪网
本文关键词:缓存 内存 数据库 SQL Server
  经常有网友会问,SQL Server占用了太多的内存,而且还会不断的增长;或者说已经设置了使用内存,可它没有用到那么多,这是怎么一回事儿呢?

  下面,我们来具体看以看SQL Server是怎样使用内存的。

  最大的开销一般是用于数据缓存,如果内存足够,它会把用过的数据和觉得你会用到的数据统统扔到内存中,直到内存不足的时候,才把命中率低的数据给清掉。所以一般我们在看statistics io的时候,看到的physics read都是0。

  其次就是查询的开销,一般地说,hash join是会带来比较大的内存开销的,而merge join和nested loop的开销比较小,还有排序和中间表、游标也是会有比较大的开销的。所以用于关联和排序的列上一般需要有索引。

  再次就是对执行计划、系统数据的存储,这些都是比较小的。

  我们先来看数据缓存对性能的影响,如果系统中没有其它应用程序来争夺内存,数据缓存一般是越多越好,甚至有些时候我们会强行把一些数据pin在高速缓存中。但是如果有其它应用程序,虽然在需要的时候MS SQL会释放内存,但是线程切换、IO等待这些工作也是需要时间的,所以就会造成性能的降低。这样我们就必须设置MS SQL的最大内存使用。可以在SQL Server 属性(内存选项卡)中找到配置最大使用内存的地方,或者也可以使用sp_configure来完成。如果没有其它应用程序,那么就不要限制MS SQL对内存的使用。

  最后我们来看查询的开销,这个开销显然是越低越好,因为我们不能从中得到好处,相反,使用了越多的内存多半意味着查询速度的降低。所以我们一般要避免中间表和游标的使用,在经常作关联和排序的列上建立索引。

lxlchj_0303 2009-12-24
  • 打赏
  • 举报
回复
没有人帮忙看啊!!自己先顶一个@
dmcs51 2009-12-24
  • 打赏
  • 举报
回复
呵呵,进来学习了一下!

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧