ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 7448|回复: 17

[讨论] 创建1.25GB的数组,但是实在没想明白VBA申请内存的机制 - 已解决

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-12-6 06:27 | 显示全部楼层 |阅读模式
如图,VBA可以申请这么多的内存,但是却不能在一个数组里面申请
也不能逐步redim增大

只能先申请一大块,然后再申请较小的一块,然后逐步降低申请量

估计每次申请的最大内存量是跟Windows的剩余可用内存有关

[ 本帖最后由 灰袍法师 于 2010-10-7 01:53 编辑 ]

VBA创建1.25G的内存数组.rar

127.88 KB, 下载次数: 185

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-12-6 09:04 | 显示全部楼层
啥意思啊??
VBA创建1.25G的内存数组.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-12-6 15:21 | 显示全部楼层
就是想把Windows全部可用内存都创建为数组

然后在程序里面xxoo

可是貌似不能这样做,只能一小块一小块地申请
Option Explicit

Sub 按钮1_Click()
Dim x1() As Byte
Dim x2() As Byte
Dim x3() As Byte
Dim x4() As Byte
Dim x5() As Byte
Dim x6() As Byte
Dim x7() As Byte
Dim x8() As Byte
Dim i As Long, s As Long

ReDim x1(1 To 1024# * 1024 * 512) '这里申请512MB内存
ReDim x2(1 To 1024# * 1024 * 256) '这里如果再次申请512MB就会溢出
ReDim x3(1 To 1024# * 1024 * 256) '但是,实际上后续代码申请了不止512MB内存也没事
ReDim x4(1 To 1024# * 1024 * 128) '也就是说,不能一次申请
ReDim x5(1 To 1024# * 1024 * 64)
ReDim x6(1 To 1024# * 1024 * 64)
End Sub

TA的精华主题

TA的得分主题

发表于 2009-12-6 16:12 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-12-6 16:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 lb_bn 于 2009-12-6 16:12 发表
应该是根据系统内存的大小而分,不能全给吧。


即使如此,那为什么一次申请不给

多次申请就给呢,这不是制造麻烦么

我怀疑如果每次申请几k,最后是可以把Windows内存拿光的,要再试试

TA的精华主题

TA的得分主题

发表于 2009-12-6 17:39 | 显示全部楼层
我怀疑如果每次申请几k,最后是可以把Windows内存拿光的,要再试试,这是肯定的...

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-12-6 18:44 | 显示全部楼层
原帖由 dul 于 2009-12-6 17:39 发表
我怀疑如果每次申请几k,最后是可以把Windows内存拿光的,要再试试,这是肯定的...


试过了,每次只拿128k 或者64k或者16k
到最后都只能得到300-600MB左右的内存数组
比直接拿几百MB还少,而且速度非常慢,没用。

另外我发现,直接声明一个几百MB的数组,成功与否取决于 任务管理器--性能界面,里面的物理内存--空闲有多少
如果数组大于此空闲内存,就会error7失败
但是如果数组小于此值,也不代表一定成功,我在空闲内存1100的时候,最大只能申请到820M
而最变态的是,空闲内存很低的时候,Windows 也并不会把 缓存内存 释放,真是见他娘的鬼了
这样一来,即使我有3G内存,后台也只是运行一些小玩意。
但是VBA一次能用的始终只有几百M,多次申请才能达到1.3G

[ 本帖最后由 灰袍法师 于 2009-12-6 19:41 编辑 ]

TA的精华主题

TA的得分主题

发表于 2009-12-6 19:59 | 显示全部楼层
这是windows管理内存的机制,如果普通方法就能使用所有内存,那就变成linux了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-12-6 20:08 | 显示全部楼层
原帖由 lb_bn 于 2009-12-6 19:59 发表
这是windows管理内存的机制,如果普通方法就能使用所有内存,那就变成linux了。


或者,VBA不能申请第二个大内存的原因是:没有足够大的连续内存了

如果这样的话,应该可以申请一大堆单独的小数组,直到2GB全部拿光,

嗯,还得继续试下去。

[ 本帖最后由 灰袍法师 于 2009-12-6 20:58 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-12-6 20:57 | 显示全部楼层
哈哈哈,果然如我所料

声明200个数组

每个数组redim为10MB

就可以顺利拿到1.8GB内存,很接近2GB了

结论:
声明数组的时候,windows必须在一个连续的内存空间给它分配
如果没有足够大的连续空间,那么即使空闲内存的总量足够,也会分配失败。

所以,要使用尽可能大的内存数组,最好是把Windows的全部可以关掉的后台程序,服务全部杀掉
干净重启,然后第一时间就运行VBA程序。
而拿光现有内存是可以的,但要分很多个数组去拿。当然要拿到1个字节也不剩就很那个了。

[ 本帖最后由 灰袍法师 于 2009-12-6 20:59 编辑 ]

评分

2

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-29 19:08 , Processed in 0.047466 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表