如何解决内存溢出的问题?

JXSJXS 2003-06-03 08:52:34
各位大虾:
我写的程序用到了文件操作函数,和UPDATEBLOB,将文件存到数据库中,以实现系统在局域网的升级更新。但文件太大,在向数据库中写时会遇到out of menony 的错误。即使将文件拆分为不大于32768的块存到数据库也是如此。
各位大虾有和高招,快请赐教。急!急!急!急!
...全文
252 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
2002dandelion 2003-06-04
  • 打赏
  • 举报
回复
gz,studay
lgmzhy 2003-06-03
  • 打赏
  • 举报
回复
gz
bomber2001 2003-06-03
  • 打赏
  • 举报
回复
^_^,重新生成看看
freeliu 2003-06-03
  • 打赏
  • 举报
回复
我也曾经遇到和你相同的问题,
你应该这样解决。首先,你对多个文件操作时,肯定用的循环,将创建olecontrol的代码和释放的代码放到循环内,虽然这样做会牺牲速度。也就是说,每处理一个文档,创建一次,释放一次。

其次也是最重要的,不要在pb环境下测试,因为这样,pb的资源不释放。编译之后再测试。我原来遇到的问题是在pb中运行时,最多只能处理30多个文档。然后就溢出了。但是编译后,我处理了350个word文档,内存使用平稳,没有发生任何问题。
waterstony 2003-06-03
  • 打赏
  • 举报
回复
regenerate
debug跟踪
coolroy2000 2003-06-03
  • 打赏
  • 举报
回复
估计程序写的有问题!再仔细看看。包括死循环,数据库连接判断啊,等等......
逢桥夜泊 2003-06-03
  • 打赏
  • 举报
回复
gz了
dpianpian 2003-06-03
  • 打赏
  • 举报
回复
gz
JXSJXS 2003-06-03
  • 打赏
  • 举报
回复
用我的办法,小的文件没事,有两个文件分别为326b 和 66.0kb 都没事,可如果文件为715kb,存这个文件没事可下一个文件不管多大都溢出。
JXSJXS 2003-06-03
  • 打赏
  • 举报
回复
上面的办法我也用过,它是把超过32768的文件份多次打开,再组合在一起,但如个组合在一起再往数据库里放更容易溢出,我是把文件拆分为好多块放到数据库中。
我的qq:37159700
uc:3074143 能加我吗?我好像你请教,多谢
freeliu 2003-06-03
  • 打赏
  • 举报
回复
bp对大于32765的文件是这样处理的,对比一下就知道错在那里了。
integer li_FileNum, loops, i

long flen, bytes_read, new_pos

blob b, tot_b

// Set a wait cursor

SetPointer(HourGlass!)

// Get the file length, and open the file

flen = FileLength(sle_filename.Text)

li_FileNum = FileOpen(sle_filename.Text, &
StreamMode!, Read!, LockRead!)

// Determine how many times to call FileRead

IF flen > 32765 THEN
IF Mod(flen, 32765) = 0 THEN
loops = flen/32765
ELSE
loops = (flen/32765) + 1
END IF

ELSE
loops = 1

END IF

// Read the file

new_pos = 1

FOR i = 1 to loops
bytes_read = FileRead(li_FileNum, b)
tot_b = tot_b + b

NEXT

FileClose(li_FileNum)
JXSJXS 2003-06-03
  • 打赏
  • 举报
回复
改sqlca.autocommit=ture 也不行
JXSJXS 2003-06-03
  • 打赏
  • 举报
回复
上面是我写的程序,帮忙看看有啥毛病,怪了,我把数组去掉了,还是不行
JXSJXS 2003-06-03
  • 打赏
  • 举报
回复
ls_filename=profilestring("update.ini","filelist","filename","")
for li_i=1 to li_numf
li_pos=pos(ls_filename,"!")
ls_temp=mid(ls_filename,1,li_pos - 1)
ls_filename=mid(ls_filename,li_pos + 1)
If fileexists(ls_temp) Then
ll_length = FileLength(ls_temp)
li_fileno = FileOpen(ls_temp,StreamMode!)
If ll_length > 32765 Then
If Mod(ll_length,32765) = 0 Then
li_loops = ll_length/32765
Else
li_loops = ll_length/32765 + 1
End If
Else
li_loops = 1
End If

For li_ii = 1 To li_loops
ll_read = FileRead(li_fileno,lb_b)
ll_position = ll_position + ll_read
FileSeek(li_fileno,ll_position,FromBeginning!)

insert into update_name(id,file_name,file_no)
values(:li_id,:ls_temp,:li_ii)
commit;

UpdateBlob update_name
Set docu = :lb_b
Where Id = :li_id
commit;
Next

FileClose(li_fileno)
End If

if sqlca.sqlcode<>0 then
uo_1.of_setvalue(0)
timer(0)
messagebox("提示","数据库升级失败!")
return
end if

li_id=li_id + 1
next
end if
freeliu 2003-06-03
  • 打赏
  • 举报
回复
我向数据库中保存文档是这样做的:
ls_file = 'c:\temp.doc' //获得文档的路径和名称
ole_1.insertfile(ls_file)
lb_file = ole_1.objectdata
SQLCA.AutoCommit = TRUE
UPDATEBLOB t_doc SET doc_content = :lb_file WHERE doc_code = :ls_doc_code;
不用考虑是否大于32768
JXSJXS 2003-06-03
  • 打赏
  • 举报
回复
不是,我用数组是为了把一个文件拆分成不大于32768的块,好向数据库中放
freeliu 2003-06-03
  • 打赏
  • 举报
回复
updateblob在执行的时候,要求设置aotucommit= true,所以,你没有必要用数组来保存,只需用一个变量就行了,这不就把对文件的操作分开了么?
JXSJXS 2003-06-03
  • 打赏
  • 举报
回复
怎么把对文件的操作分开?
JXSJXS 2003-06-03
  • 打赏
  • 举报
回复
是不是数组占用内存太多,那有什么函数能把数组destroy了
freeliu 2003-06-03
  • 打赏
  • 举报
回复
把对文件的操作分开。
加载更多回复(1)

1,079

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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