| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1536 人关注过本帖
标题:求教:在VFP中如何高效地创建、计算、处理、储存、检索64位整型数?
只看楼主 加入收藏
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:347
专家分:326
注 册:2013-10-4
结帖率:100%
收藏
 问题点数:0 回复次数:10 
求教:在VFP中如何高效地创建、计算、处理、储存、检索64位整型数?
实践证明,为超大的DBF表提速,终极杀手锏便是字符串哈希。
具体算法,网上到处都可找到C源码。
众所周知,VFP是32位的,整型变量和字段,也都是32位的。
而好的哈希算法,需用到64位的大整型数。
之前有大侠提示过:在vfp2c32.fll中,提供了一系列64位整型数计算相关函数,现在问题是:
不仅仅需要在中间过程进行64位大整数的计算,还需要将64位整型数结果保存到DBF表中,并且要能高效检索。
这个储存与检索的问题有些麻烦:
似乎,只能以字符串或二进制字符串的类型来保存,索引与检索(Index和IndexSeek)效率会不会受到较大影响?
毕竟,32位整型的效率,在VFP当中,那是相当高的!
搜索更多相关主题的帖子: 检索 储存 VFP 整型 计算 
2022-05-04 16:14
sych
Rank: 5Rank: 5
等 级:职业侠客
威 望:7
帖 子:248
专家分:337
注 册:2019-10-11
收藏
得分:0 
尺有所短,寸有所长
与其讨论性能上的瓶颈,不如直接把问题抛出来,大家一起寻求解决办法

[此贴子已经被作者于2022-5-5 08:24编辑过]

2022-05-05 08:22
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:347
专家分:326
注 册:2013-10-4
收藏
得分:0 
以下是引用sych在2022-5-5 08:22:36的发言:
尺有所短,寸有所长
与其讨论性能上的瓶颈,不如直接把问题抛出来,大家一起寻求解决办法


举个例子。设:
N1 = 3772834016  &&即16进制0xE0E0 E0E0
N2 = 2880154539  &&即16进制0xABAB ABAB
在VFP中,是无法计算N1+N2=?,因结果超出了32位整型数的最大值范围,导致结果数值溢出。
又或者:
N1 = 247256450130144  &&即16进制0xE0E0 E0E0 E0E0
N2 = 188753807911851  &&即16进制0xABAB ABAB ABAB
在VFP中,我们也无法计算N1-N2=?,因N1和N2都超出了32位整型数的范围。

那么,可以想到的解决方案,似乎是:
将64位整型数,按32位分割成高低两段,分别进行计算,然后再小心处理一下高低两段之间的进位与借位即可。
大整数用16进制来表示与储存会比较方便一些,起码比较直观(0xE0E0 E0E0 E0E0远比247256450130144优雅漂亮好多,不是吗?)
然而,在DBF表当中,则不应将0xE0E0 E0E0 E0E0储存为ASCII字符串“0000E0E0E0E0E0E0”,因为那意味着将原本64位(8字节)的数据,储存为16字节的字符串,长度扩大了一倍,计算开销也扩大了一倍,无形之中,也就失去了“字符串哈希”的意义了。
也就是说,0xE0E0 E0E0 E0E0应当保存为可变长二进制型(Q,Varbinary):0h0000E0E0E0E0E0E0,仍为64位(8字节)。

现在问题来了。如何高效在地在两种类型之间相互转换:
3772834016  ←→ 0hE0E0E0E0
2880154539  ←→ 0hABABABAB

还有,可变长二进制型(Q,Varbinary)在索引、检索与一些函数方面的限制,会不会对我们进行64位整型数模拟计算时,造成不必要的麻烦?
我觉得,这可能也是需特别注意的问题。
2022-05-05 12:48
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:654
专家分:2535
注 册:2018-3-13
收藏
得分:0 
还用vfp2c32函数呗,Int642Str,Str2Int64

这家伙很懒,啥也没留下
2022-05-05 13:15
xuminxz
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:41
帖 子:763
专家分:2503
注 册:2011-5-8
收藏
得分:0 
没有一种语言是万能的(否则其它语言就被淘汰了)。如果经常涉及到超大数值,VFP显然不是好的选择;C系列好像也不如Python吧。

dBase有人接盘了。
2022-05-05 15:45
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:347
专家分:326
注 册:2013-10-4
收藏
得分:0 
以下是引用xuminxz在2022-5-5 15:45:55的发言:
没有一种语言是万能的(否则其它语言就被淘汰了)。如果经常涉及到超大数值,VFP显然不是好的选择;C系列好像也不如Python吧。


有点儿“跑偏”了。
暂且先抛开64位整型数吧,也先抛开VFP2C32。
在VFP当中,有没有现成的函数,或者简便高效的方式,能够直接进行这样的相互转换:

I, Integer  ←→  可变长二进制型(Varbinary)
3772834016  ←→  0hE0E0E0E0

这样一来,当我计算得到3772834016(即0xE0E0E0E0),便能够直接地将其实际数值,正确地转换为二进制原文0hE0E0E0E0,然后储存到dbf表中;
当我计算得到0xE0E0 E0E0 E0E0 E0E0,也能够直接地将其实际数值,正确地转换为二进制原文0hE0E0E0E0E0E0E0E0,然后储存到dbf表中。
反之,当我从dbf表中取出二进制原文0hE0E0E0E0,便能够直接地将其转换为实际数值0xE0E0E0E0,然后进行数值计算;
计算完毕,再将最终结果正确地转换为二进制原文,然后储存到dbf表中。

如此,问题的第一步,便简化为,在VFP当中,能否方便地直接进行这种相互转换:
I(Integer)  ←→  二进制原文(Varbinary)
2022-05-05 16:38
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:347
专家分:326
注 册:2013-10-4
收藏
得分:0 
类似转换,其实不需外求vfp2c32之类第三方函数,在VFP语言内部便能够办到。
讲真,我对VFP语言不太熟,我能想到的一种“啰哩啰嗦”、很不优雅的方法是:

I = 3772834016
C = TRANSFORM(I, "@0")
C = "0h"+SUBSTR(C,3)
B = EVALUATE(C)
? B

正所谓“精益求精”吧,直觉告诉我,理论上VFP应该有更简洁、更优雅的转换方法的,恳请大佬们指教!
2022-05-05 17:03
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10568
专家分:43031
注 册:2014-5-20
收藏
得分:0 
C库API有输入输出函数
2022-05-05 19:48
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9821
专家分:27099
注 册:2012-2-5
收藏
得分:0 
这样行吗
I = 3772834016
?CHRTRAN(TRANSFORM(I, "@0"), "x", "h")

坚守VFP最后的阵地
2022-05-05 20:21
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:347
专家分:326
注 册:2013-10-4
收藏
得分:0 
以下是引用sdta在2022-5-5 20:21:09的发言:

这样行吗
I = 3772834016
?CHRTRAN(TRANSFORM(I, "@0"), "x", "h")


感谢sdta指教!这个跟7#区别不大。

另,二进制原文(或可变长二进制)0hE0E0E0E0与普通字符串"0hE0E0E0E0",是完全不同的两种字符串。
2022-05-05 21:27
快速回复:求教:在VFP中如何高效地创建、计算、处理、储存、检索64位整型数?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013369 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved