回 帖 发 新 帖 刷新版面

主题:维度相同,角标不同的矩阵,占内存相同吧?

有两个矩阵A(1:10,1:10),B(101:110,101:1:1),他们虽然角标不同,但是占的内存应该是相同的吧?

回复列表 (共12个回复)

沙发

占用内存大小怎么计算呢?1M=1000*1000,1000*1000的矩阵占1M是吧?1G=1024M?

板凳

一般来说,

内存大小 = 第一维大小 * 第二维大小 * 单个变量长度

比如 real ,interger 都是 4 字节

而 double 都是 8 字节

complex 另算

因此,你的例子如果是 4 字节的类型,那么大小是 10 * 10 * 4 = 400 字节,不到半KB。

如果你使用了不从 0 开始的数组,比如 a( 100:101 ) 那么会有几个字节的内容来描述这个数组的上下限。基本可以忽略。

3 楼

学习了。也就是说,角标不同占用内存基本相同,只是0 和100 占字节数不同而已。

complex 另算

怎么算呢?我的数组全是complex*16的啊。

谢谢石头

4 楼

这么说吧,比如

complex*16 代表双精度的复数。实部双精度8字节,虚部双精度8字节,那么一共16字节。

complex*16 B(101:110,101,1:1)

占的空间就是:

( 110 - 101 + 1 ) * ( 101 ) * ( 1 - 1 + 1 ) * 16

= 10 * 101 * 16

而它与

complex*16 a( 10 , 101 )

占的空间是差不多的。

5 楼


精彩啊!!

我想问下:
设置动态数组的时候
      COMPLEX*16,DIMENSION(:,:),ALLOCATABLE::  SLN,SRN
    ALLOCATE(SLN(LN*N,N),SRN((LN)*N+1:(L-1)*N,N))
          DEALLOCATE(SLN,SRN) 
    DEALLOCATE之后这个数组就不存在了吧?
    DEALLOCATE之后我想看下这个数组是不是清空了,但是没有输出,说出错,如果在DEALLOCATE之前输出,则可以看到这个数组。可能是DEALLOCATE之后就跟没设置这个数组一样了

6 楼

有没有办法随用随DEALLOCATE?比如一个大数组A(5*N,5*N),我用的时候先用A(1:N,5*N),在用A(N:N+1,5*N),由于都比较大,我想用完第一部分之后就清空了,然后再用第二部分再清空,节约内存啊

7 楼

Deallocate 之后,这个数组的空间被释放了。

但是编译器依然可以识别它。它可以被再次分配。

如果你想循环使用,每次只用 1 行(或1列),为什么不直接定义为 1 维数组呢?

8 楼


你的意思是不是这样?S是动态数组,我这次清空了,编译器有记忆,仍然记得它,我想用的时候仍然把它调过来用,用它的时候它又占内存了吧?用完之后再次清空,它的内存又释放了?

如果你想循环使用,每次只用 1 行(或1列),为什么不直接定义为 1 维数组呢?

回答:是这样的,我的数组比较大,complex*16类型,N=1000,L=1000,S(N*L,N),

我实际在用的时候不是1列,是N列同时用,而且每次用N*N大小。

我有个算法,在计算的时候要先算S((L-1)*N:L*N,N),然后在算它上面的S,依次算,直到S(1:N,N),而下面的S会对上面的S由影响。但是我在用S的时候是从第一个S开始用,然后用第2个S,依次3,4,5,。。。,L,我想先把他存在一个S里,每次用完就清空它,然后调用下面的S,这样内存会不断减小。

如果按照你上面说的,COMPLEX*16类型,1000*1000*1000*16=16G,占内存确实挺大的,想节约点内存,多算几组数据呢

9 楼

编译器记得 S,只是记得这个名字。并不记得它的内容。

一旦 Deallocate 之后,内存释放了,里面的内容就丢了。

再次 Allocate 之后,虽然名字还是 S,但是内容已经完全不同了。

没有办法释放一个数组的一部分,要释放,必须整个数组释放。

我对你的算法理解得不是很深刻。这可能需要你自己去寻找合适的内存管理办法。

如果数据量真的太大,内存容纳不下,可以考虑写入数据到文件里,需要哪个(哪些)数据,再到文件里去读。按需读取到内存。

举个例子给你:
腾讯QQ有上亿个用户,但是QQ在运行时,并没有上亿个数据的数组。
一个 rmvb 几百 MB,完全解压开,估计有上 GB ,但是播放器播放时,也并不占用几百MB的内存。

10 楼


石头老兄,很感谢你!!
你的意思是这样吧?
我程序在运行的时候如果把数据存储在一个文件里太大了,这时候我可以把他们以二进制形式写在文件中,每产生一组数据就写一个文件,给他们不同的名字,需要谁就调用谁,调用完之后就清空,这样很节约内存。

能否给我发个这方面的链接啊?

你真是好人啊!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册