Fortran Coder

标题: 346082*346082大数组debug时触发断点 [打印本页]

作者: Proteus    时间: 2021-4-16 09:54
标题: 346082*346082大数组debug时触发断点
[Fortran] 纯文本查看 复制代码
integer dim
real(kind=8),allocatable::t(dim,dim),r(dim)
dim=346082
allocate(t(dim,dim),r(dim))


出现断点的地方时allocate中的r(dim),显示undefined pointer/array,但是t(dim,dim)是正常的,会不会我的数组太大了,我使用到蛮多数组,都挺大的,这t和r只是其中的两个,感谢各位大佬!!

2.png (10.89 KB, 下载次数: 468)

2.png

1.png (41.85 KB, 下载次数: 481)

1.png

作者: vvt    时间: 2021-4-16 10:18
你的猜测没错,数组太大了。
346082*346082 这个数组,需要 958GB 的内存。
作者: Proteus    时间: 2021-4-17 11:17
vvt 发表于 2021-4-16 10:18
你的猜测没错,数组太大了。
346082*346082 这个数组,需要 958GB 的内存。

那有什么办法可以解决吗
作者: 胡文刚    时间: 2021-4-17 15:13
本帖最后由 胡文刚 于 2021-4-17 15:27 编辑

根据情况用其他计算方法代替。
嗯,除了内存,你还可以用硬盘存储数据。

我在steam上买了一个《生化危机3重制版》,它有22GB那么大,占了这么大的硬盘空间,但内存里并没有22GB大小的数组。

富士康的工人每天需要处理3000多件装配件,但公司并没有给他们分配能装下3000多个装配件的桌子。你说怎么办呢?

我们国家有(约)14亿人口,每个人都有独一无二的身份证号码。但公安系统的电脑内存里,没有一个14亿大小的数组来记录他们的身份证号码。

此外,在60年代的时候,内存普遍只有64KB到128KB,航天飞机轨道计算的任务仍然被计算机正确的执行了。



作者: dfct    时间: 2021-4-17 20:28
allocatable 的数组需要是假定形状的
尝试
[Fortran] 纯文本查看 复制代码
real(kind=8),allocatable :: t(:,:), r(:)

!=================
另,有名为 dim 的内置函数,虽然 Fortran 没有保留字,但是还是尽量避免与内置函数同名
可以考虑用 ndim 代替 dim

作者: Proteus    时间: 2021-4-23 15:57
dfct 发表于 2021-4-17 20:28
allocatable 的数组需要是假定形状的
尝试
[mw_shl_code=fortran,false]real(kind=8),allocatable :: t(:,: ...

已解决,谢谢你!
作者: SSDQBD    时间: 2021-12-12 20:09
楼主怎么解决的,我也遇到了类似的问题
作者: navoski    时间: 2022-1-19 22:24
胡文刚 发表于 2021-4-17 15:13
根据情况用其他计算方法代替。
嗯,除了内存,你还可以用硬盘存储数据。

使用动态数组随时写入文件、释放内存,有效。搞定了360000×3000×2的大数组。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2