欢迎光临散文网 会员登陆 & 注册

小内存服务器与大数据:如何避免内存浪费

2023-03-11 11:27 作者:生信小院  | 我要投稿


一 起因

起因嘛,非常简单。最近自己要复现一个作者(20年,16G内存)的算法来分析一个已发表的数据,竟然发现64G的内存不够用。不行,肯定得折腾,于是,就有下面的推文

Ps:还是建议大家拥有足够的内存使用空间,不用这么畏首畏尾,胡乱折腾。

二 正文

为方便演示,我先展示一段代码

肯定有读者想要问这段代码是什么意思。bingo,就交给ChatGPT吧!


这段代码的作用是生成随机数据,并将其转换为 Pandas 数据框,然后使用 Pandas 对数据框进行操作和合并,最终计算并输出每组数据在元组('condition_A', 'condition_B', 'fold')的平均表现。

具体步骤如下:

1:定义一个空字典 result,用于存储每组数据在不同的条件和折叠次数下的数据框。

2:定义一个列表 cycle_list,其中包含了 20 组条件,每组条件包括三个整数值:a、b 和 c,它们分别等于 1+unit_x、30+unit_x 和 60+unit_x,其中 unit_x 取值从 0 到 19。

3:对于每组条件,生成一个具有大量随机数据的 NumPy 数组 data,其中数组的行数根据公式计算得出,每行包含 10 个随机数。

4:将 NumPy 数组 data 转换为 Pandas 数据框 df。

5:将 Pandas 数据框 df 作为值,以元组 (a, b, c) 作为键,添加到字典 result 中。

6:将字典 result 中的所有数据框按照元组 (a, b, c) 进行拼接,并以这三个条件为索引,得到一个大的 Pandas 数据框 result_merge。

7:在 Pandas 数据框 result_merge 中,根据元组 (a, b, c) 对得分列 score 进行分组,并计算每组的平均值,得到一个 Pandas 序列 performance。

总的来说,这段代码主要是用于生成大量的随机数据,并对这些数据进行 Pandas 操作和合并,以实现对数据的快速处理和分析。

2.1 代码重构

首先,我们拿这一段代码来说,第一个问题出现在下面这段代码中

我们发现这一段代码中最主要的问题出现在后面的result_merge变量仅仅需要使用到score标签的数值,然而,代码的这一步环节,却生成了两个变量

因此,我们需要改变的地方就是在

2.2 改变精度

我们接着会发现,其中内存占用较高的原因是因为这个变量

这里每一步都会产生约4G的内存使用量。那么我们该如何改变这个现象了,这里就得提到python数据精度的问题了。默认情况下,python的浮点精度是float64,但是这一浮点精度是可以调整到float32。因此,我们可以将代码修改成这样,直接减少一半的内存使用量

需要注意的是,这一步的实施其实是有代价的。这会牺牲数据的精度,对于结果也会有一些细微的影响,但是,如果在短时间内我们无法提高数据内存容量的时候,并且确定自己数据中大部分内容的精度是低于float32的时候,我们就可以采用这一方法

2.3 及时释放内存

需要注意的,有时候某些步骤的运算可能也是特别耗内存的,比如下面这一步。我们假设在某个断点,在result_merge变量未生成的时候,这一步,pd.concat其实一直在消耗着内存,占用存储空间。即在原变量保持不变的环境下,新的临时变量一直在占用内存

此时,我们可以通过以下函数实现最小内存空间的占用

我们通过循环的方式,避免了一次生成大的变量,并且在新变量不断变大的过程中,我们通过del和gc命令,减少原变量的内存使用量,避免了两个变量同时挤占内存,有效减少了内存的动态使用。这一步也可以理解成为以时间换空间吧。
三 惯例小结

虽然,我们通过改变作者的代码实现低内存下运行一些之前需要两到三倍内存的数据,但是这往往需要牺牲精度或者时间。即使原作者的代码的确有很大的改进空间(的确可能会有),我们通常也不会轻易变动(除非读者有信息熟读代码,了解整体的代码框架)。因为谁知道你一改会不会结果有较大偏差了呢?

所以,最好的情况是拥有足够的资源,可以使用作者的源代码跑出结果。如果这种情况满足不了的话,那只能笔者一样了(手动狗头)。

四 公众号其他资源(方便读者使用)

本公众号开发的相关软件,Multi-omics Hammer软件和Multi-omics Visual软件欢迎大家使用。

Multi-omics Hammer软件下载地址:

https://github.com/wangjun258/Multi-omics-Hammer

Multi-omics Visual软件下载地址:https://github.com/wangjun258/Multi_omics_Visual/releases/tag/Multi_omics_Visual_v1.03

PS:因为本软件是用python脚本撰写,调用了部分依赖包,用户首次使用需要安装python以及对应的包,安装之后便可永久使用。

下面是本号在其他平台的账户,也欢迎大家关注并多提意见。

简书:WJ的生信小院

公众号:生信小院

博客园:生信小院

最后,也欢迎各位大佬能够在本平台上:1传播和讲解自己发表的论文;2:发表对某一科研领域的看法;3:想要达成的合作或者相应的招聘信息;4:展示自己以寻找博后工作或者博士就读的机会;5:博导提供博后工作或者博士攻读机会,都可以后台给笔者留言。希望本平台在进行生信知识分享的同时,能够成为生信分析者的交流平台,能够实现相应的利益互补和双赢(不一定能实现,但是梦想总得是有的吧)。

五 每日一图(源自Stable-diffuse创作) 



小内存服务器与大数据:如何避免内存浪费的评论 (共 条)

分享到微博请遵守国家法律