求助!VB一维数组中的数据个数最多能到多少

fuck-forever 2018-04-14 08:02:48
这是和数据个数有关还是和内存大小有关?
我直接定义的single类型最大个数到9千万多个数据,再多就溢出
但是现在有一个以前的老程序,要算超过6千万个数据点。现在提示内存溢出,求大佬帮忙啊
...全文
1561 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2018-04-18
  • 打赏
  • 举报
回复
引用 20 楼 sunylf 的回复:
6千万的数据放到内存中,够强。
6千万? 看看楼主在11楼说的,是要: 6千万 ×8 !!!
sunylf 2018-04-17
  • 打赏
  • 举报
回复
6千万的数据放到内存中,够强。
fuck-forever 2018-04-16
  • 打赏
  • 举报
回复
引用 17 楼 Chen8013 的回复:
32位程序,“4G限制”肯定没法破啊! 就比如说,难道你想用“1个字节”的数据,表示0到300???
好吧,多谢啦
赵4老师 2018-04-16
  • 打赏
  • 举报
回复
在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。
舉杯邀明月 2018-04-16
  • 打赏
  • 举报
回复
32位程序,“4G限制”肯定没法破啊! 就比如说,难道你想用“1个字节”的数据,表示0到300???
fuck-forever 2018-04-16
  • 打赏
  • 举报
回复
引用 1 楼 Chen8013 的回复:
VB6是“32位程序”,理论上的“进程空间”是4GB, 但除开一些“系统地址空间”、保留空间、代码地址空间等之后,  实际上用户能支配的“用户数据空间”可能只有不到1.5GB了。 (前提是系统中的“空闲内存”足够多,当然目前的硬件环境,多数情况下内存不是问题) 不知道你的“数据”是什么样的数据,但如果要“全部在内存中”,可以估算一下: 1. 如果是“字节数据”,约1.6亿个。 2. 如果是“2字节整数”,约8千万个。 3. 如果是Long整数(32位整数),约4千万个。 4. Single类型是4字节、Double类型是8字节(还有其它类型,略……)。 5. 如果是“文本”,这算起来就复杂多了:    (a)每个“字符"占2字节,“字符串头”还占4字节,实际数据空间就看“文本有多长”了;    (b)最常见的是“变长字符串”变量,它实际数据一般是在“堆”中动态分配的,       分配时还有附加的“内存管理”方面的数据信息。这个我真还说不清楚会占用多少;    (c)你的“大量数据”,肯定是得用“数组”,字符串数组的每个“元素”得占4字节。    (d)另外“数组名”(数组变量名)占4字节、数组的“分配信息”约占 “16+8*维数”字节。       当然,对于“巨量数据”来说,这项是可以忽略不计的。 所以说,你的“6000万数据”,就看你的是什么样的数据了。 极有可能是“根本没法容纳”的。
4G的限制没有一点办法突破嘛
赵4老师 2018-04-15
  • 打赏
  • 举报
回复
容量大小从小到大:栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储 当程序需要使用比如2GB~1TB左右的存储时,最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数,linux参考fseeko64函数。
FILE *fA;fA=fopen("A","rb+");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000];
int B;
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999];
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B;
fclose(fA);
舉杯邀明月 2018-04-15
  • 打赏
  • 举报
回复
引用 14 楼 nnnnnn1nnnn 的回复:
[quote=引用 13 楼 Chen8013 的回复:] . . . . . . . . . . . .
用64位平台重新编写代码是什么意思呢,在64位的机器上编译还是神马?[/quote] 你把“开发64位程序”想得这么简单? 64位程序,要“支持64位”的开发环境、并且要“编译成64位程序”(具体的细节我也不清楚,应该是可以选择、配置的)才行。 比如你如果用的是VB6,别说“64位机器”了,就是640位机器,编译出来照样是32位程序。 因为这个“开发平台”就是32位的、它也只支持开发32位的“产品”。 就目前来说,最“容易获得”的,应该就是Visual Studio 2008(或更高版本的)了。 如果你有“之前”的代码,肯定得在相应的开发环境下,还要作相应的“修正”的。 (我不清楚VB.NET是否支持64位程序开发,因为我没有使用过,也没去过多的了解它)
fuck-forever 2018-04-15
  • 打赏
  • 举报
回复
引用 13 楼 Chen8013 的回复:
不过话又说回来,如果对“速度”没什么苛求,并且你一定考虑用“VB6”来开发的话,   那么通过一定的“管理方式”,用磁盘文件来中转一下,还是可行的。 PS: 我还真想不出什么样的应用场景,会用到这么“庞大”的几个数组…… 
用64位平台重新编写代码是什么意思呢,在64位的机器上编译还是神马?
舉杯邀明月 2018-04-15
  • 打赏
  • 举报
回复
不过话又说回来,如果对“速度”没什么苛求,并且你一定考虑用“VB6”来开发的话,   那么通过一定的“管理方式”,用磁盘文件来中转一下,还是可行的。 PS: 我还真想不出什么样的应用场景,会用到这么“庞大”的几个数组…… 
舉杯邀明月 2018-04-15
  • 打赏
  • 举报
回复
引用 11 楼 nnnnnn1nnnn 的回复:
[quote=引用 7 楼 Chen8013 的回复:] [quote=引用 5 楼 nnnnnn1nnnn 的回复:] [quote=引用 3 楼 Chen8013 的回复:] 你说的“6000万数据”,自己算算需要多少内存空间(当然只能是“估算”)…………
single类型的,还有就是不知道数组的具体大小,采用了redim preserve来逐次增加数组的大小,导致在数组达到6千多万时提示内存溢出[/quote] 太频繁的Redim Preserve肯定不好啊…… 既慢、又很容易造成“内存碎片”,这就可能导致后来需要“大片空间”时,无法申请到内存。 要真有“大量Redim Preserve”的需求,你得考虑你的“数据管理”是否存在不合理的地方了…… [/quote] 诶,道理我都懂,这是一个10多年前的老程序,那时写程序的人没考虑到会处理到这么大的数据量。我刚才试了一下,数据量应该至少在8*6千万个single,这可就蛋疼了[/quote] 你要想搞“8*6KW个Single数据”,32位程序肯定蛋疼啊…… 4.8亿个数据,要么你改用64位平台重新编写代码(最简便的方法);   要么你得考虑如何优化“数据管理”方法,不会“同时存在”这么多的数据(照样得“重写程序”,并且增加了逻辑复杂度)!
fuck-forever 2018-04-15
  • 打赏
  • 举报
回复
引用 7 楼 Chen8013 的回复:
[quote=引用 5 楼 nnnnnn1nnnn 的回复:] [quote=引用 3 楼 Chen8013 的回复:] 你说的“6000万数据”,自己算算需要多少内存空间(当然只能是“估算”)…………
single类型的,还有就是不知道数组的具体大小,采用了redim preserve来逐次增加数组的大小,导致在数组达到6千多万时提示内存溢出[/quote] 太频繁的Redim Preserve肯定不好啊…… 既慢、又很容易造成“内存碎片”,这就可能导致后来需要“大片空间”时,无法申请到内存。 要真有“大量Redim Preserve”的需求,你得考虑你的“数据管理”是否存在不合理的地方了…… [/quote] 诶,道理我都懂,这是一个10多年前的老程序,那时写程序的人没考虑到会处理到这么大的数据量。我刚才试了一下,数据量应该至少在8*6千万个single,这可就蛋疼了
X-i-n 2018-04-15
  • 打赏
  • 举报
回复
用sql server。
脆皮大雪糕 2018-04-15
  • 打赏
  • 举报
回复
并不是单纯的考虑一个数组最大能有多少个元素。这其实还和你其他的定义有关,堆空间用完了就溢出了。 举个例子

    Dim a(50000000) As Single
    Dim b(60000000) As Single
    Dim c(70000000) As Single
当你逐行增加上述代码并执行测试的时候,到第三行的时候就溢出了,这并不是说不能定义7000万元素的single数组。当你把第一行注释以后是不会溢出的。
脆皮大雪糕 2018-04-15
  • 打赏
  • 举报
回复
换换思路 考虑一下,有没有必要把几千万数据放在内存里。 能不能分段进行数据的处理,暂时不处理的数据保存在文件里或者干脆就不需要做任何存储? 当你在挑战语言或者编译器或者系统的极限的时候,往往是你做了很多不必要的事情。
舉杯邀明月 2018-04-15
  • 打赏
  • 举报
回复
引用 5 楼 nnnnnn1nnnn 的回复:
[quote=引用 3 楼 Chen8013 的回复:] 你说的“6000万数据”,自己算算需要多少内存空间(当然只能是“估算”)…………
single类型的,还有就是不知道数组的具体大小,采用了redim preserve来逐次增加数组的大小,导致在数组达到6千多万时提示内存溢出[/quote] 昨天晚上,我回复之后,看到你说可以定义“9千万”的数组,我试了一下(只是没法再说结果了): 在IDE中运行时,定义1.3亿的Long数组是没问题的,但1.4亿时就报内存溢出了。 (定义的固定数组、用代码对每个元素赋值。Long类型跟Single占用空间一样的。) 这个“数量”比我在2楼说的少得多啊…… 于是,我编译成 exe来运行,当然仍然是用的Long类型(主要是操作速度快些),其中: 有个1.4亿的模块级的固定数组; 另有一个“过程级”的动态数组(数组大小用文本框输入),2.7亿都成功的,2.8亿时提示内存溢出。 所以,你如果是Single类型的话,6000万是根本没问题的(除非内存资源确实不够)。 如果在IDE中运行不行,你可以试试编译后的exe能否成功运行。 因为IDE会加载很多dll,这些“代码空间”可能把进程空间“截断”了;而数组元素是要求“连续的一片地址空间”的。 实在不行的话,你干脆再试试直接定义一个足够大的固定数组来用(相当于“事先占着地”,当然必须编译后运行),   让dll在加载时进行“重定位”(你的exe不可能没用到“第3方组件”吧)。
舉杯邀明月 2018-04-15
  • 打赏
  • 举报
回复
引用 5 楼 nnnnnn1nnnn 的回复:
[quote=引用 3 楼 Chen8013 的回复:] 你说的“6000万数据”,自己算算需要多少内存空间(当然只能是“估算”)…………
single类型的,还有就是不知道数组的具体大小,采用了redim preserve来逐次增加数组的大小,导致在数组达到6千多万时提示内存溢出[/quote] 太频繁的Redim Preserve肯定不好啊…… 既慢、又很容易造成“内存碎片”,这就可能导致后来需要“大片空间”时,无法申请到内存。 要真有“大量Redim Preserve”的需求,你得考虑你的“数据管理”是否存在不合理的地方了……
fuck-forever 2018-04-15
  • 打赏
  • 举报
回复
引用 3 楼 Chen8013 的回复:
你说的“6000万数据”,自己算算需要多少内存空间(当然只能是“估算”)…………
single类型的,还有就是不知道数组的具体大小,采用了redim preserve来逐次增加数组的大小,导致在数组达到6千多万时提示内存溢出
舉杯邀明月 2018-04-14
  • 打赏
  • 举报
回复
你说的“6000万数据”,自己算算需要多少内存空间(当然只能是“估算”)…………
舉杯邀明月 2018-04-14
  • 打赏
  • 举报
回复
我在楼上的回复中,好像是少数错了1位“10进制数”,因此“1. ~ 3.”中说的数量,应该增大10倍: 1. 约16亿 2. 约8亿 3. 约4亿
加载更多回复(1)

7,763

社区成员

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

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