主题:维度相同,角标不同的矩阵,占内存相同吧?
tianhy2010
[专家分:60] 发布于 2012-06-17 08:10:00
有两个矩阵A(1:10,1:10),B(101:110,101:1:1),他们虽然角标不同,但是占的内存应该是相同的吧?
回复列表 (共12个回复)
沙发
tianhy2010 [专家分:60] 发布于 2012-06-17 08:16:00
占用内存大小怎么计算呢?1M=1000*1000,1000*1000的矩阵占1M是吧?1G=1024M?
板凳
臭石头雪球 [专家分:23030] 发布于 2012-06-17 09:02:00
一般来说,
内存大小 = 第一维大小 * 第二维大小 * 单个变量长度
比如 real ,interger 都是 4 字节
而 double 都是 8 字节
complex 另算
因此,你的例子如果是 4 字节的类型,那么大小是 10 * 10 * 4 = 400 字节,不到半KB。
如果你使用了不从 0 开始的数组,比如 a( 100:101 ) 那么会有几个字节的内容来描述这个数组的上下限。基本可以忽略。
3 楼
tianhy2010 [专家分:60] 发布于 2012-06-17 09:28:00
学习了。也就是说,角标不同占用内存基本相同,只是0 和100 占字节数不同而已。
complex 另算
怎么算呢?我的数组全是complex*16的啊。
谢谢石头
4 楼
臭石头雪球 [专家分:23030] 发布于 2012-06-17 09:51:00
这么说吧,比如
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 楼
tianhy2010 [专家分:60] 发布于 2012-06-17 11:01:00
精彩啊!!
我想问下:
设置动态数组的时候
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 楼
tianhy2010 [专家分:60] 发布于 2012-06-17 11:04:00
有没有办法随用随DEALLOCATE?比如一个大数组A(5*N,5*N),我用的时候先用A(1:N,5*N),在用A(N:N+1,5*N),由于都比较大,我想用完第一部分之后就清空了,然后再用第二部分再清空,节约内存啊
7 楼
臭石头雪球 [专家分:23030] 发布于 2012-06-17 11:19:00
Deallocate 之后,这个数组的空间被释放了。
但是编译器依然可以识别它。它可以被再次分配。
如果你想循环使用,每次只用 1 行(或1列),为什么不直接定义为 1 维数组呢?
8 楼
tianhy2010 [专家分:60] 发布于 2012-06-17 11:38:00
你的意思是不是这样?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 楼
臭石头雪球 [专家分:23030] 发布于 2012-06-17 12:45:00
编译器记得 S,只是记得这个名字。并不记得它的内容。
一旦 Deallocate 之后,内存释放了,里面的内容就丢了。
再次 Allocate 之后,虽然名字还是 S,但是内容已经完全不同了。
没有办法释放一个数组的一部分,要释放,必须整个数组释放。
我对你的算法理解得不是很深刻。这可能需要你自己去寻找合适的内存管理办法。
如果数据量真的太大,内存容纳不下,可以考虑写入数据到文件里,需要哪个(哪些)数据,再到文件里去读。按需读取到内存。
举个例子给你:
腾讯QQ有上亿个用户,但是QQ在运行时,并没有上亿个数据的数组。
一个 rmvb 几百 MB,完全解压开,估计有上 GB ,但是播放器播放时,也并不占用几百MB的内存。
10 楼
tianhy2010 [专家分:60] 发布于 2012-06-17 19:36:00
石头老兄,很感谢你!!
你的意思是这样吧?
我程序在运行的时候如果把数据存储在一个文件里太大了,这时候我可以把他们以二进制形式写在文件中,每产生一组数据就写一个文件,给他们不同的名字,需要谁就调用谁,调用完之后就清空,这样很节约内存。
能否给我发个这方面的链接啊?
你真是好人啊!!
我来回复