返回信息流大家好!最近用matlab跑一个数据量比较大的程序,预估需要的计算和存储总空间大概在450GB的量级。
目前实验的解决方案是利用硬盘做缓存的方式支持程序的内存占用消耗。目前程序还在运行,但是预设的每个大循环结束在控制台打印的内容在打印出4次之后,工作台一直没有新结果打印出来。监控的内存提交量维持在27GB左右,随时在这个量级上浮动。
基于这个现象,有如下一些疑问,希望有遇到类似情况的朋友帮忙解答下,多谢了!
1、matlab运行大表的时候,如果大量使用缓存空间的话,是否会出现向控制台打印的内容延缓输出?
这里的大表不是矩阵维度高,主要是行数高,主表365*24*60*60行,最大列数89列。实验过这个规模的全零表内存需要约21GB。期间进行对应运算和数据临时存储,也需要这样多行数但列数在10列以内的临时表。
预设的大流程,会跑60次循环,每次循环处理的数据量相同。每个循环内会读取3份不同的文件并进行处理,处理的结果生成行数与大表一致的增量结果存入大表中。
为实时监控程序运行状况,在每个循环内,每处理一次数据读取后,写了now、memory、whos用来在控制台观察内存炸用情况;每处理一个输入,会清理掉处理过程中建立的大的临时变量,并再次使用memory、whos监控。
现象:运行半小时的时候,控制台输出显示完成了4个大循环,状态栏一直是繁忙状态,电脑并没有死机但操作卡顿严重。matalb无报错,内存消耗维持在27GB浮动,cpu占用波动较大,在40%到90%或更高值波动。控制台无其他数据输出。在控制台敲入memory命令没有任何反应。
2、matlab是否有机制会自动协调cpu的占用?
程序刚刚跑起来,cpu占用至少75%,但是目前运行一上午加一中午的时间,cpu普遍占用率已经在50%上下,虽然波动幅度很大,但是相比开始要下来一些。
3、matlab跑大数据量时,运行时间能用数据量做线性估计么?
如果按照这个程序已经在控制台打出来的4次循环显示的话,半小时4个大循环,60个大循环不到8小时应该能跑完。早上不到8点开始跑的,目前下午2点。主要心里发慌还是控制台打印出来的信息一直停留在第4个大循环结束,而matlab一直在占用资源,占用量不如开始那么大却也一直维持在固定水平。所以很纠结是否是程序已经出现问题,但是又怕贸然停止程序反而是错误的……
4、有什么办法能够判定matlab是否已经跑死?
matalb还在跑,控制台没有错误提示,自然也就没有停止运行。
但是预设的控制台打印的效果不再出现。
而参考已经出现过的控制台信息,应该已经完成了更多次控制台打印才对。
另外就是程序头半小时占用cpu的强度明显略高于目前cpu占用的强度。
比较纠结,求助。先谢过!
这是一条镜像帖。来源:北邮人论坛 / matlab / #12440同步于 2017/9/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Matlab机器人发帖
【问题】Matlab运行大表内存占用及使用缓存中的问题
wangshoufeng
2017/9/11镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
好大的量啊,没遇到过啊~顶多因为矩阵比较大,多清除几次前面的无效变量就好一些了。或者设置变量的时候尽量整块整块的设置,不要太零散(这个说法是之前自己百度,你可以搜一下"MATLAB占用内存大,运行缓慢处理方法"之类),还有别的一些设置,你可以试试?
谢谢啊,百度上已经搜过一遍了,常见的几套方案都看过了,对我这里的话不是很适用。
我用的win10,内存16GB,matlab是2014a版本,所以上面最可能的3GB内存开关的问题应该本身就屏蔽掉了,而且之前我测试的时候,开始因为给的虚拟内存不足,跑2个循环之后就没内存而崩掉过。那时候吃掉的内存已经27GB了。
现在matlab的程序还是在运行着,控制台显示仍然停在完成第4个循环(早上8点运行,8点半就这个显示)。内存申请量维持在27GB。cpu占用比较搞笑,大部分时间60%多,间歇飙到90%。然后我刚刚手欠运行过其他软件(之前用会吃掉一半cpu的),系统cpu自动超频,最大cpu出现过110%+,这个软件平安运行结束……
现在最希望的就是,matlab确实是会出现占用内存大的时候,向控制台输出被延缓(这样能侧面证明程序没有跑死掉)
不过网上没有找到有人有我类似这样的经历……
【 在 jinliu 的大作中提到: 】
: 好大的量啊,没遇到过啊~顶多因为矩阵比较大,多清除几次前面的无效变量就好一些了。或者设置变量的时候尽量整块整块的设置,不要太零散(这个说法是之前自己百度,你可以搜一下"MATLAB占用内存大,运行缓慢处理方法"之类),还有别的一些设置,你可以试试?
我之前涉及到编码,有一些需要存储比较多数据的矩阵变量,还要调用别的函数文件的情况,MATLAB就会运行很慢很慢,不过远远没有你这个那么久的时间就是了。最后等了一会还是会出结果,你这个情况能不能尝试把中间量先用小一点的程序运算出来,然后运行到那块儿的时候直接调用结果。如果不能这样做,那就不知道了。希望你可以找到办法,感觉遇到这样的问题很难得啊 嘿嘿~加油哈
【 在 wangshoufeng (首峰) 的大作中提到: 】
: 谢谢啊,百度上已经搜过一遍了,常见的几套方案都看过了,对我这里的话不是很适用。
: 我用的win10,内存16GB,matlab是2014a版本,所以上面最可能的3GB内存开关的问题应该本身就屏蔽掉了,而且之前我测试的时候,开始因为给的虚拟内存不足,跑2个循环之后就没内存而崩掉过。那时候吃掉的内存已经27GB了。
: 现在matlab的程序还是在运行着,控制台显示仍然停在完成第4个循环(早上8点运行,8点半就这个显示)。内存申请量维持在27GB。cpu占用比较搞笑,大部分时间...
: ...................
感谢回复:)
昨天晚上8点多跑出来结果了,但是空兴奋了一场,主要现象及问题如下:
1、前面提到一共60个大循环但是控制台只输出了4个大循环结束就不再输出的现象。最后跑完控制台输出也只有这4个大循环输出,但是诡异的是,我在所有大循环跑完之后还有一个对大表的统计过程,还有结果写入文件,在这个过程的起始和结束也都预设有控制台输出信息,这些信息能够正常显示。
也就是说,至少在控制台,跳过了后面的56次循环的输出,但是可以输出出循环之后的内容!
问题:matlab如何做到,在没有语句指令其跳出循环继续执行的情况下,忽略剩下的循环而执行后续语句??
2、为了验证上述的猜测,重新读入matlab保存的大表结果。数了一下大表的列数,与完成4次大循环的列数一致!
也即,很有可能matlab没有执行后面的循环?但是却能正常执行循环外的内容??
这样的推断让我有点难以接受!
继续猜测:
3、看到网上有关于3GB内存开启的事情,帖子很老,主要针对32位和xp、win7系统。而且当时我已经试验过内存加缓存开到27GB,也用memory在控制台检测过确实matalb的变量总占用量达到27GB而崩掉。所以昨天以来一直都认为现在的系统配置下,应该不存在这种问题了。
夜不能寐
想到一种可能,3GB问题是针对32位系统的,我现在是64位系统,那么是否64位系统也存在类似的瓶颈?
也即,大表的大小随着循环增加而不断增加。这里大表列数的规律是:17+18*n,n是循环次数。这里的n=60,算下来完整的大表需要1097列!而大表的行数:365*24*60*60 = 31536000行。这里用的matlab默认精度,也就是双精度,实数。
会不会有这样一种可能,当跑完4个循环,列数变为89列的时候,大表的大小已经达到了64位机器可以存储的极限。此时,即使跑到后面的循环中,比如第5个循环,虽然增量可以在内存中计算出来(增量18列),但是由于系统位数的限制,大表不会再增加大小。程序仍然做操作,但底层会抛弃掉无法存储的部分,于是没有报错产生……
为了验证这个猜想,我在每个大循环的末尾增加了一个向量,每跑完一个循环,向量的长度+1,新增的元素值是这个循环结束时大表的列数。
同时因为控制台输出会卡在第4循环,无法再利用控制台,所以粗暴地设置了一个保存所有变量mat……
昨晚10点多开跑。按昨天第一次的经验,早上应该跑完了。早上过来一看:
(1)控制台仍然只能显示到4次大循环结束
(2)控制台显示当前正在存储到csv文件,这个速度比第一次慢了至少2小时起
(3)因为后面还有保存所有变量到mat,预计还有很长的时间要等……
【 在 jinliu 的大作中提到: 】
: 我之前涉及到编码,有一些需要存储比较多数据的矩阵变量,还要调用别的函数文件的情况,MATLAB就会运行很慢很慢,不过远远没有你这个那么久的时间就是了。最后等了一会还是会出结果,你这个情况能不能尝试把中间量先用小一点的程序运算出来,然后运行到那块儿的时候直接调用结果。如果不能这样做,那就不知道了。希望你可以找到办法,感觉遇到这样的问题很难得啊 嘿嘿~加油哈
跟同事咨询了下64位系统和32位系统支持内存大小的问题,网上也查了下,具体边界值目前还是晕,但是从数值估计来看,应该不会存在因为达到64位系统支持的上限而无法写入的问题。具体换算截图如下:
1.84467E+19 64位机器寻址数 64位支持的内存大小 2147483648 GB
2.30584E+18 可以支持的最大double数 2的48次方对应的内存大小 32768 GB
31536000 行数
1097 列数
34594992000 总数
2.7676E+11 总数需要的内存空间(每个double占8字节)
257.7527761 内存空间单位换算位GB
也即,这个规模的大表全部需要258GB内存来存储,当然这里没有算其他的附加变量所需内存,但是应不至于总数超450GB(450GB是第一次跑的时候我设置的虚拟内存,现在跑的第二次也是这么大虚拟内存。早期27GB虚拟内存实验了下,内存不够程序会崩掉,控制台报错。这一现象两次都没有再出现)
所以现在也懵了……
如果不存在存储的瓶颈,如何解释matlab跳过剩余的56次循环执行循环外的语句的呢?
不清楚450G的数据量,怎么运行的,我现在也碰到这个问题了,不过还好机器是256G内存的,现在勉强能算,但是以后可能要开更大的数组,想知道怎么才能突破内存限制,是拿硬盘做虚拟内存吗?
网上的方法都是突破几个G内存的,没啥参考意义。
不过据说matlab有个Data Store和Tall Array的技术应用在大数据方向,不知道能不能拿来参考一下。
感谢回复!
看来可能有类似的需求
周末我做的测试出结果了,不过是因为matlab意外错误终止的,想要的内存保存和数据结果存入文件的代码都还没有运行。根据控制台输出内容来看,报错位置出现在所有循环结束后,进行大表(365*224*3600行,1097列,稀疏矩阵)内的按指定列运算的位置。
上述的大表在内存中占用空间22.9GB
其他计算用的辅助变量,每个文件处理后会删除无用的变量,所以清空后所需的存储空间可以忽略基本。
运算过程中我用memory显示当前占用内存情况,whos也用了,但是跑大量的时候看细节没多大意思,主要还是看总体量。
运算过程中会维持在matlab占用内存22GB的量级,提示可供变量使用的内存212GB量级。在后面换算成Byte的位置可以看出来,可供变量的内存是占用内存*10的量级备用(我的理解)
就您说到的几点,结合我这次测试的体会尝试回答下,一起讨论:
1、我用游戏本跑的,物理内存16GB,剩下都靠加缓存,就是拿硬盘空间换内存。测试中因为之前一个bug的问题,所以预估到用到450GB的量,实际测下来没有用那么多。所以您第一个问题,是否能用硬盘突破内存限制的答案是可以。我这个测试实际中已经这样用成了。
2、网上几个G内存的方案我也看过了,比较老。我也试算了下64位系统的极限,在前面的回帖里有详细的内容。总体来讲,我认为使用到win10、matlab2014a(仅因为我测试用的这个配置),可以不在乎帖子几个G的限制,无需设置其他条件,开足了虚拟内存空间就可以。
3、我的这次测试,尽管实际占用内存量很小,但最终在处理大表的时候出现意外错误而终止,查了一早上log,没有找到很满意的解释。一会在下面的回帖中把报错细节发上来,请大家一起帮忙看看
4、您提到的两项新技术我没有接触过,希望一起探讨
【 在 dhown 的大作中提到: 】
: 不清楚450G的数据量,怎么运行的,我现在也碰到这个问题了,不过还好机器是256G内存的,现在勉强能算,但是以后可能要开更大的数组,想知道怎么才能突破内存限制,是拿硬盘做虚拟内存吗?
: 网上的方法都是突破几个G内存的,没啥参考意义。
: 不过据说matlab有个Data Store和Tall Array的技术应用在大数据方向,不知道能不能拿来参考一下。