PB中如何在大型BLOB变量中快速查找4位BLOB变量!

lizx 2000-07-20 12:39:00
在下列程序中,由于在BLOB数据类型中没有提供类似字符串
查找的pos(str1,str2)函数,因此查找速度极慢,请教各位
高手有办法加快查找速度吗?
[注:若使用mm=string(m),则mm为NULL,故无法使用pos(mm,'9988')查找]

blob {1000000000} m
blob {4} v
... // m 已被赋值
v=blob('9988')
for i=1 to 1000000000 STEP 4
if BlobMid(m,i, 4) = v then
MessageBox("提示",'在M中查找到V的位置为:' + string(i*4) )
end if
next
...全文
360 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lizx 2000-07-23
  • 打赏
  • 举报
回复
hyzx2000老兄:
我测试了,你说的不错,Windows内存的确是按堆栈字节数分块的,要么为空,
要有就一定是4096字节。那我只能用4096作循环,这速度太慢了,不知类似
金山游侠的游戏工具用的是什么原理,搜索一遍内存速度极快!你有其他的
方法吗?另我已给你加上100分了,再次表示感谢!


(为什么这个主题在论坛中找不到了?)
hyzx2000 2000-07-22
  • 打赏
  • 举报
回复
今晚我对你发给我的程序进行了测试,发现根本原因是你的程序考虑不周。
1.我运行你提供的被测试程序和测试程序,并将被测试程序的内存保存成文件,分别用400字节和4000字节每次,发现两个文件的内容并不相同。
2.函数ReadProcessMemory()应声明为:
FUNCTION ulong ReadProcessMemory(ulong hProcess,ulong lpBaseAddress,ref blob lpBuffer,ulong nSize,ref ulong lpNumberOfBytesWritten)LIBRARY "kernel32.dll"
其中lpNumberOfBytesWritten应该通过引用传值,返回每次读取的内存大小。
因此,在你的测试程序中,应该去掉SetNull(ip);并增加对ip的判断,ip为0时不应该进行检索,因为该函数并没有读取内存。在调用我的程序时,应该用ip代替设置的blob大小。
3.因为Windows运行程序时,进程的内存并不是连续的,我对你提供的程序进行以下测试:
每次40,400,4000,4096,1024字节。内存分布如下,每一行为起始地址和大小:
每一块为40bytes时的内存分布:
4194304:28672
4259864:8168
5308424:4088
5373984:4064
6512664:8168
6541344:12256
6619144:4088
7667744:4064
7733264:65520
11927584:4064
12976144:4080
13041664:36864
14086144:8192
15134744:45032

每一块为400bytes时的内存分布:
4194304:28672
4259904:8128
5308704:3808
5374304:3744
6512704:8128
6541504:12096
6619504:3728
7667904:3904
7733504:65280
11927904:3744
12976304:3920
13041904:36624
14086304:8032
15135104:44672

每一块为4000bytes时的内存分布:
4194304:28672
4262304:5728
5310304:2208
5374304:3744
6514304:6528
6542304:11296
6622304:928
7670304:1504
7734304:64480
11930304:1344
12978304:1920
13042304:36224
14086304:8032
15138304:41472

每一块为1024bytes时的内存分布:
4194304:28672
4259840:8192
5308416:4096
5373952:4096
6512640:8192
6541312:12288
6619136:4096
7667712:4096
7733248:65536
11927552:4096
12976128:4096
13041664:36864
14086144:8192
15134720:45056


每一块为4096bytes时的内存分布:
4194304:28672
4259840:8192
5308416:4096
5373952:4096
6512640:8192
6541312:12288
6619136:4096
7667712:4096
7733248:65536
11927552:4096
12976128:4096
13041664:36864
14086144:8192
15134720:45056

4.查看以上结果,发现1024和4096的结果一致。为什么?因为Windows内存分块时,一般为4096bytes,这个数值可以通过程序检索到,使用函数GlobalMemoryStatus()。因此在你的程序中不应该使用象400,4000这样的分块,而应该与系统的内存分块大小一致,否则会有许多的内存块会读取不到,造成检索失败。

5.希望以上分析对你有帮助,你的靓程序写出之后,别忘了给我寄壹份(包括源码)。在此,提前说声谢谢了!
lizx 2000-07-22
  • 打赏
  • 举报
回复
我测试了,有点问题,我已将我的程序发来给你,请再帮我试试看,谢谢了!
lizx 2000-07-21
  • 打赏
  • 举报
回复
已收到了,谢谢!待我晚上试用ok后,即给分!
hyzx2000 2000-07-21
  • 打赏
  • 举报
回复
我已经发了壹份给你。
hyzx2000 2000-07-21
  • 打赏
  • 举报
回复
我正在用VC编写一个dll来解决它!

1,072

社区成员

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

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