当小内存遇上大量数据时该怎么办?
极客时间编辑部
讲述:初明明大小:3.36M时长:03:41
假如你写了一个处理数据的软件,它可以在小样本文件上运行地很好,但一旦加载大量真实数据后,这个软件就会崩溃,你该怎么办?
近日,InfoQ 编译了 Python 顾问伊塔玛·特纳(Itamar Turner-Trauring)的文章,他认为可以通过压缩、分块、索引这三种方式减少电脑内存使用。以下是原文内容。
为什么需要 RAM?
在解决问题之前,我们需要先弄清楚问题是如何产生的:为什么需要计算机内存 RAM?
众所周知,RAM(计算机内存)能让你读写数据,硬盘也可以读写数据,而且还比 RAM 更便宜。既然有硬盘了,为什么还需要 RAM 呢?可以不可以直接从硬盘读写数据呢?理论上讲,答案是可以的。但是,即便是最现代化且速度很快的 SSD 硬盘也比 RAM 慢太多:
从 SSD 上读取数据大约需要 1.6 万纳秒
从 RAM 上读取数据大约需要 100 纳秒
也就是说,如果你想要实现快速计算,数据就只能放在 RAM 中,否则你的代码运行时就会慢上 150 倍。
减少内存使用的三个技巧
当你没有足够的 RAM 时,最简单省时的解决方案就是花钱,要么购买一台计算机,要么租一台云端的虚拟机。但这个方案价格昂贵,甚至有些时候会入不敷出,这时你就需要考虑如何通过修改软件来减少内存使用了。具体有以下三个技巧。
1. 压缩
包括无损压缩和有损压缩两种方式。其中,无损压缩存储的数据包含的信息,和原始数据包含的信息完全相同。有损压缩存储的数据丢失了一些原始数据里的细节信息,但是这种信息丢失理想情况下不会对计算结果造成什么影响。
这里的压缩指的不是使用 ZIP 或者 gzip 工具来压缩文件,而是内存中的数据压缩表示形式。例如,你的数据有两个值:Available 和 Unavailable,你可以将其存为一个布尔值,用 True 或者 False 表示,这样你就可以只用 1 个字节来表示了。你甚至可以继续压缩至 1 位来表示布尔值,这样就继续压缩到了 1 个字节时的 1/8 大小。
2. 分块
当你需要处理所有数据,而又无需把它们同时载入内存时,可以采用分块方案,把数据按块载入内存,每次只加载所有数据里的某一块。
比如,当你想搜索一本书里的最长单词时,你可以一页一页地载入这本书,这样你使用的内存就大大减少了,因为你一次只需要把这本书的一页载入内存,而最后得到的结果仍然是正确的。
3. 索引
你可以使用索引在不同时刻加载数据的不同子集,虽然分块也能解决这个问题,但与索引相比,分块会加载很多不相关的数据,速度较慢,而索引可以快速告诉你到哪里能找出你关心的那部分数据。
假设你想阅读书本中关于土豚的章节,如果你运用分块技术,你得载入整本书,一页一页的载入,从每页中搜寻土豚。用索引的话,你可以在这本书的索引部分找到土豚的索引项,它会告诉你在哪页可以读到相关内容。和分块相比,索引的搜索速度要快很多。
最简单也最常用的实现索引的方法,就是在目录里给文件恰当地命名,比如你可以用年份和月份命名,当你想查看某个月的数据时,只需打开对应的文件即可。
以上就是伊塔玛·特纳关于修改软件来减少内存使用的三个技巧,希望对你有所帮助。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论