vb中定义一个超大数据的二维数组报内存溢出,有什么办法解决?

sbgf5678 2021-04-09 12:31:20
用vb写一个双色球的选号程序,将双色球17721088注号码的每一注号码分为两个属性:固有属性和关系属性,固有属性是号码的诸如AC值、奇偶比例等固定不变的属性,关系属性是此注号码与最近几期开奖号的关系属性,如从上期号码沉淀下来了几个号码等属性情况。
现在我把这两个属性都转化为了十进制的数字来标识,固有属性标识范围大概在0-500000之间(实际存在的属性标识没有那么多),关系属性标识范围大概在0-1200000之间(同样实际存在的属性标识也没有那么多),现在我要做如下处理
定义一个二维数组 Public HaoMaSX(500000, 1200000) As Integer来统计相同属性号码的注数,如果注数很少就选中这种属性的号码
如:01 02 03 04 05 06 +01 (固有属性标识是12345,关系属性标识是123456789,此时运算HaoMaSX(12345,123456789)=HaoMaSX(12345, 123456789)+1,结果为1)
01 02 03 04 05 06 +02 (固有属性标识也是12345,关系属性标识也是123456789,此时运算HaoMaSX(12345,123456789)=HaoMaSX(12345, 123456789)+1,结果为2)
统计完所有号码后如HaoMaSX(12345, 123456789)值不大是就选中所有这样属性的号码。

目前的问题是:定义这个二维数组 Public HaoMaSX(500000, 1200000) As Integer 系统报内存溢出错误,我查阅了相关资料是不能定义这么大的数据,求助各位大神大侠,这种情况有什么其他算法或思路来解决?或者怎样变通地来定义这样大的数组?谢谢
...全文
866 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
脆皮大雪糕 2021-04-14
  • 打赏
  • 举报
回复
思路不对,建立一个巨大数组,然后最后绝大多数都没有数据。 应该换一个方向,建立一张表,一个期号,两个属性各放一个字段。最后统计两个属性的情况即可。 彩票那么多年,一年也就百多期。所有历史数据加起来顶多是万级别的数据。对于数据统计来说Biubiubiu的事情,你要弄一个打爆内存的数组实在不值得。
sbgf5678 2021-04-14
  • 打赏
  • 举报
回复
感谢各位的解答,我找到了个变通的解决办法了。结题了,分不多,但感谢各位的参与,顺祝各位生活愉快!
sbgf5678 2021-04-14
  • 打赏
  • 举报
回复
各位楼主,分不多,但我选择了“平均给分”来答谢各位的回复,结贴后居然显示“无满意答复” 这不是我的本意,大家的答复启发了我的思路,学习了不少的知识,再次感谢大家!
sbgf5678 2021-04-14
  • 打赏
  • 举报
回复
引用 12 楼 脆皮大雪糕的回复:
思路不对,建立一个巨大数组,然后最后绝大多数都没有数据。 应该换一个方向,建立一张表,一个期号,两个属性各放一个字段。最后统计两个属性的情况即可。 彩票那么多年,一年也就百多期。所有历史数据加起来顶多是万级别的数据。对于数据统计来说Biubiubiu的事情,你要弄一个打爆内存的数组实在不值得。
我是将双色球全部号码共17721088注号码按属性特征进行筛选,历史开奖数据只是参考。
不懂别说哎 2021-04-13
  • 打赏
  • 举报
回复
嗯,那你可以用WINSOCK或者DDE做程序的异步处理,然后将N个进程的数据返回整理好,就可以了,主要是每个进程的处理任务标志,和处理完的整合
sbgf5678 2021-04-13
  • 打赏
  • 举报
回复
引用 7 楼 不懂别说哎的回复:
如果一定要在不优化算法的情况下来做,建议你做异步通讯处理,这样会增加处理的效率,但是同一时间需要的资源会增大,就是说将数据分割成几部分交给另外一个进程去处理,然后返回数据统一整理
我不是想不优化算法,但脑壳都想破了也没有找到适宜更优的算法,觉得只能这样处理才能达到预期的结果。感谢提供思路哟,兄台
赵4老师 2021-04-13
  • 打赏
  • 举报
回复
引用 6 楼 sbgf5678 的回复:
[quote=引用 4 楼 赵4老师的回复:]用文件模拟内存
您好,用文件模拟内存是不是建立文件进行读写数据的操作,如果是这样,运算是不是很费时呢?我也考虑过这样的思路:用文件名作第一维(可能会产生10万多个文件),用文件里的数据序号作第二维(每个文件里估计会有百来十万个数据),这样应该能解决问题,但运算的时耗会不会太大了。希望指点下,谢谢[/quote] 不试怎么知道呢?
不懂别说哎 2021-04-13
  • 打赏
  • 举报
回复
如果一定要在不优化算法的情况下来做,建议你做异步通讯处理,这样会增加处理的效率,但是同一时间需要的资源会增大,就是说将数据分割成几部分交给另外一个进程去处理,然后返回数据统一整理
sbgf5678 2021-04-12
  • 打赏
  • 举报
回复
引用 4 楼 赵4老师的回复:
用文件模拟内存
您好,用文件模拟内存是不是建立文件进行读写数据的操作,如果是这样,运算是不是很费时呢?我也考虑过这样的思路:用文件名作第一维(可能会产生10万多个文件),用文件里的数据序号作第二维(每个文件里估计会有百来十万个数据),这样应该能解决问题,但运算的时耗会不会太大了。希望指点下,谢谢
sbgf5678 2021-04-12
  • 打赏
  • 举报
回复
引用 3 楼 舉杯邀明月的回复:
你要定义 HaoMaSX(500000, 1200000) As Integer ???
你知道这个多少个数组元素吗?需要占用多大的存储空间吗!!!


你需要的解决方案有两个:
⒈ 采用64位编程环境 ,然后在超算上去调试和运行…………
  因为目前没有哪台家用电脑能提供这么大的运行空间。

⒉ 仔细分析一下你的“实际需求”,优化一下算法,采用一个没那么浪费资源的实现方案。
祝你好运…………
感谢回复解答!
赵4老师 2021-04-12
  • 打赏
  • 举报
回复
用文件模拟内存
舉杯邀明月 2021-04-10
  • 打赏
  • 举报
回复
你要定义 HaoMaSX(500000, 1200000) As Integer ???
你知道这个多少个数组元素吗?需要占用多大的存储空间吗!!!


你需要的解决方案有两个:
⒈ 采用64位编程环境 ,然后在超算上去调试和运行…………
  因为目前没有哪台家用电脑能提供这么大的运行空间。

⒉ 仔细分析一下你的“实际需求”,优化一下算法,采用一个没那么浪费资源的实现方案。
祝你好运…………
sbgf5678 2021-04-09
  • 打赏
  • 举报
回复
感谢一楼详尽耐心的解答,我好好研究下你提供的方法,再次感谢!
不懂别说哎 2021-04-09
  • 打赏
  • 举报
回复
这个问题有几个思路来解决 第一个,需要的逻辑性较强,比如定义一个二维数组下标不能太大,这个时候你可以定义两个一维数组组合运用,比如二维数组(2,2) 0.0=1 0.1=2 0.2=3 1.0=4 1.1=5 1.2=6 2.0=7 2.1=8 2.2=9 换成两个一维数组可以写成A(0)=“1,2,3” A(1)=“4,5,6” A(2)=“7,8,9” 数组A的下表是二维下标对应的行,然后Split(A(元素))拆分出来的分别对应二维下标的列,这样依旧能组合成一个二维数组 第二种方法,由于双色球数字最大不超过50,所以可以用BYTE类型,这个数组最大可以存放2亿5千万左右的元素,你可以确保一个因素满足的情况下将需求分割成多个数组,比如A(50万,500) B(50万,500)……N万个这样的数组,这里由于N万个太多了,可以用动态数组通过程序来动态生成这些数组,然后用循环参与之后的计算,不过这个方法运行速度是最慢的,复杂度是也是最高的,不实际 说两句题外话, 第一,2亿5千万的下标上限是根据计算机硬件和系统设置有关系,不同的电脑或者系统会有差异 第二,如果一个程序需要一次性定义上亿的变量证明程序的逻辑性很差,最好是从算法上下手修正才是正解

7,781

社区成员

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

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