如何使用10M的内存读入100M的文件,并且保证在读取过程中可进行删除、修改和增加内容
来源:互联网 发布:淘宝奖池怎么设置 编辑:程序博客网 时间:2024/06/02 13:21
这是几个月前我面试金山网络的校招题目,面试官的原题是:假设你的电脑内存是100M,现在让你去读取一个1G的电影,在看电影的过程中可以进行剪切或插入片段,你应该怎么去设计这个内存。说完后面试官就把一张纸一支笔放在我面前,然后自己拿出手机在那里玩游戏……
那时到了面试结束我问面试官有没标准的答案,他说答案不能告诉我的,因为后面还有很多人面试,鄙人不才,目前还是一名学生,以下只是我分享一下自己的思考过程,有什么不正确的地方请大牛们指出,不胜感激……
我把问题转化为一个读文件的模型,假设我有10M的内存,我要显示一个100M的文件内容,并且在读取过程中可进行删除、修改和增加内容。10M的内存假设在内存中的地址是1-10共10个单位
100M的文件在磁盘中的内存地址假设为1-100共100个单位,可以将其分段:
1--------9
10------18
19------27
28------36
37------45
46------54
55------63
64------72
73------81
82------90
91------99
100
为什么我不直接把这100M直接以每10M为一段分10段这样就可以直接读10次就读完完事了?哈哈,请继续往下看->
确定好模型后就开始做正事了:
1.对于文件的读取
因为我在磁盘中是以9个单位为一段,所以就算完整地在10个单位的内存读入一段还有1个单位的空闲区,这1个单位的空闲区就是我用来保存磁盘的地址和边界,我只需要在这个空闲区记录下(1,9)、(10,9)、(19,9)、(28,9)、(37,9)、(46,9)、(55,9)、(64,9)、(73,9)、(82,9)、(91,9)、(100,1)这12个地址数组,其中每一个小括号表示(磁盘起始地址,地址长度),他们的相对地址为1-12,还需要在空闲区记录下此时读到的相对位置,例如读完1-9这一段后,此时应该读到的相对位置就是2,继续按顺序读取下一段,以此类推下去
2.对于读取过程中进行文件的增加内容
假设当我读到磁盘地址为20时想插入一段内容,此时插入的内容保存的磁盘起始地址是135,共有13个单位,这样可以拆分为(135,9)、(144,4),此时空闲区保存的地址数组顺序应该为(1,9)、(10,9)、(19,1)、(135,9)、(144,4)、(20,8)、(28,9)、(37,9)、(46,9)、(55,9)、(64,9)、(73,9)、(82,9)、(91,9)、(100,1),相对地址就变成1-15,应该读到的相对位置为4。其他的情况以此类推
3.对于读取过程中进行文件内容的删除
假设我删除的内容地址为(19,1)和(135,3),{ps:为什么会出现这样?因为当我读19的时候,(139,9)这一段内容已经加到缓存里面去了,这样子我查看起来就感觉内容就是一直无间断地显示出来},此时空闲区保存的地址数组顺序应该为(1,9)、(10,9)、(138,6)、(144,4)、(20,8)、(28,9)、(37,9)、(46,9)、(55,9)、(64,9)、(73,9)、(82,9)、(91,9)、(100,1),相对地址就变成1-14,应该读到的相对位置为3。其他的情况以此类推
4.文件内容的修改就不再多余叙述了
面试完毕后我回去宿舍查看一下金山网络的新闻动态,发现他们最近在wps上新加了一个功能:可以在手机wps上读取大文件。看完后我深深地后悔了,如果要准备面试一家公司,一定要对公司的动态或产品有了解,这样就能有充分的知识准备去应对面试。
- 如何使用10M的内存读入100M的文件,并且保证在读取过程中可进行删除、修改和增加内容
- Delphi 如何使用 Matlab 的 .m文件?
- Java在读取文件内容的时候,如何判断出空白行
- MATLAB中M文件的使用
- 五、如何修改m文件的打开方式?
- 取当前m文件的dir
- VI中删除文件行尾的^M符号
- Python使用linecache高效读入大文件内容(M级以上)
- 删除windows文件末尾的^M
- UNIX/LINUX删除文件末尾的^M
- 删除vim打开文件末尾的^M
- 如何对chromium进行瘦身,把25M的大小较少到10M左右呢?
- 修改Matlab同m文件的关联
- 使用c#进行数据库的查看增加修改删除数据
- VC2005如何调用MATLAB2009a中编写的m文件
- 删除D盘空目录 、检索大于10M的文件
- C++中.h文件和.m文件的区别
- 【转】计算器的MC、MR、MS、M+、M-如何使用
- Android 向右滑动销毁(finish)Activity, 随着手势的滑动而滑动的效果
- 考数据库系统会用到的一些计算方法和题目整理(2)
- Hibernate连接SQL Server(非默认实例)URL配置
- Struts2中值栈的理解【转】
- CopyOnWrite容器
- 如何使用10M的内存读入100M的文件,并且保证在读取过程中可进行删除、修改和增加内容
- Silverlight中使用枚举变量载入页面的下拉菜单(WPF)
- 一次CTS引发的网络故障
- 数据结构之队列(链式队列)
- ACM日历题新版(界面修改+国际节日)(空)
- gerrit安装笔记
- oracle 增删改查基础操作 及rownum 和rowID 详解
- CC2014中国互联网版权保护行动计划启动
- 中国大陆开源镜像站汇总