上周五的时候去参加了一个面试,被问到了这个问题。问题描述如下:

假如存在一个很大的文件,文件中的每一行是一个字符串。请问在内存有限的情况下(内存无法加载这个文件中的所有内容),如何计算出出现频率最高的前100名字符串?

由于面试之前在学习hbase时了解了一下布隆过滤器(对bitmap的扩展使用),所以当时立刻想到用bitmap去解决这个问题,但是考虑到bitmap无法对出现的单词计数的。所以我当时的回答是:

首先实例化一个数组,然后读取文件对每一行的字符串进行hash得到一个数值,然后将数组下标为这个数值的值+1,最后再将这个数组排序并取出前100名。

后面想想自己的回答简直是驴头不对马嘴,我的答案并没有解决面试官的问题,可想而知我的面试注定失败。事后自己总结了一下,为什么面试的时候会作出这样的回答?

  1. 面试的时候没有仔细想清楚面试官的问题,就匆忙回答。
  2. 平时研究问题的时候,只徒留表面没有深入,或者是自以为自己弄清楚了就把它抛之脑后了。没有实际编码操作并对其进行总结和记录。
  3. 懒!在听完面试官的问题后懒的思考,没有理清思路,胡乱回答自己学习过的算法,而且是没有深入理解并且没有实际应用过的算法。

知错能改才是最重要的,希望自己在未来的工作学习中能够踏踏实实,静下心来好好研究技术,多总结多记录。

接下来总结一下正确的答案,其实是在我看了编程珠玑的第一张后想到的答案。如果早些看了这本书那么这次面试可能就不会这么糟糕了。在看了第一张以后,我对大数据的处理方法的总结是四个字:分而治之。所谓分而治之就是把大文件拆分成多个内存能够一次性容纳的小文件,然后依次处理所有小文件,最后对小文件归并处理。具体到这个面试题:

  1. 假设分成n个小文件。读取大文件,对每一行hash得到hash值h,把这行写入第h/n个文件中。这样做是为了保证相同的字符串一定被分到相同的文件中。如果小文件依然比内存大,那么我们再对其进行相同的操作(把小文件分成更小的文件,直到可以被内存一次性装载为止)。
  2. 对所有小文件进行统计计算(如利用HashMap)并排序,然后将结果写入新的文件。文件内容是:字符串,出现次数。
  3. 读取所有新生成的文件中的前几条记录并排序,最后输出top N。

感觉这个很像Hadoop里的map reduce。把大文件分成很多小文件分配给map task,再由reduce task统计map的输出,最后得出所需结果。

大数据量情况下求top N的问题的更多相关文章

  1. phpExcel导入大数据量情况下内存溢出解决方案

    PHPExcel版本:1.7.6+ 在不进行特殊设置的情况下,phpExcel将读取的单元格信息保存在内存中,我们可以通过 PHPExcel_Settings::setCacheStorageMeth ...

  2. phpExcel大数据量情况下内存溢出解决

    版本:1.7.6+ 在不进行特殊设置的情况下,phpExcel将读取的单元格信息保存在内存中,我们可以通过 PHPExcel_Settings::setCacheStorageMethod() 来设置 ...

  3. 大数据量情况下高效比较两个list

    比如,对两个list<object>进行去重,合并操作时,一般的写法为两个for循环删掉一个list中重复的,然后再合并. 如果数据量在千条级别,这个速度还是比较快的.但如果数据量超过20 ...

  4. MYSQL的大数据量情况下的分页查询优化

    最近做的项目需要实现一个分页查询功能,自己先看了别人写的方法: <!-- 查询 --> <select id="queryMonitorFolder" param ...

  5. C#拼接SQL语句,SQL Server 2005+,多行多列大数据量情况下,使用ROW_NUMBER实现的高效分页排序

    /// <summary>/// 单表(视图)获取分页SQL语句/// </summary>/// <param name="tableName"&g ...

  6. 大数据量冲击下Windows网卡异常分析定位

    背景 mqtt的服务端ActiveMQ在windows上,多台PC机客户端不停地向MQ发送消息. 现象 观察MQ自己的日志data/activemq.log里显示,TCP链接皆异常断开.此时尝试从服务 ...

  7. 大数据量场景下storm自定义分组与Hbase预分区完美结合大幅度节省内存空间

    前言:在系统中向hbase中插入数据时,常常通过设置region的预分区来防止大数据量插入的热点问题,提高数据插入的效率,同时可以减少当数据猛增时由于Region split带来的资源消耗.大量的预分 ...

  8. java 导出Excel 大数据量,自己经验总结!

    出处: http://lyjilu.iteye.com/ 分析导出实现代码,XLSX支持: /** * 生成<span style="white-space: normal; back ...

  9. MySQL数据库如何解决大数据量存储问题

    利用MySQL数据库如何解决大数据量存储问题? 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存储大数据量的问题,主要是数据库中的两张历史数据表,一张模拟量历史数据和一张开 ...

随机推荐

  1. 阿里云 CentOS7.2 配置FTP+Node.js环境

    本人小白,写下这篇博客意在记录踩过的坑,大神请绕道~ 准备工作 安装自己喜欢的连接软件(一般是putty或者xshell),本人选择的是xshell,软件如图 : 通过软件中的ssh连接连接上已经购买 ...

  2. QT枚举类型与字符串类型相互转换

    在QT中将枚举类型注册(QT_Q_ENUM或QT_Q_FLAG)后,就可以利用QT的元对象进行枚举类型与字符串类型转换了. 代码示例: #include <QtCore/QMetaEnum> ...

  3. Android中的eventBus传值

    第一步:在build.gradle中添加依赖dependencies { compile 'org.greenrobot:eventbus:3.0.0'} 第二步:创建一个 Event类: 注意:en ...

  4. .NET架构师

    闲话不多扯,关于.NET架构师的培训  架构师的知识体系总结:7大重点,对7大重点作为细节的阐述将再后面陆续展开!架构师的体系纲领主要来着这7点.(必须严格记下) 1:现代软件开发过程及架构策略 1. ...

  5. <?php function say() { echo 'hello world'; } //在这里调用函数 say(); php 调用方法say()

    <?php function say() {     echo 'hello world'; } //在这里调用函数 say(); php 调用方法say()

  6. spring ,mybatis多数据源

    同一个项目有时会涉及到多个数据库,也就是多数据源.多数据源又可以分为两种情况:   1)两个或多个数据库没有相关性,各自独立,其实这种可以作为两个项目来开发.比如在游戏开发中一个数据库是平台数据库,其 ...

  7. jQuery执行进度提示窗口的实现(progressbar)

    使用jQuery原生插件,先看效果: 主要是progressbar的更新进度以及“请稍等”后省略号.倒计时关闭的效果 如果执行单个任务的时间较长,会导致浏览器假死,一定要使用异步,代码结构要稍作调整. ...

  8. linux下svn用法

    linux下svn的一些常用命令: checkout代码到当前目录: svn co svn://192.168.22.23/project  ./ swich 切换分支: 先查看当前工作副本:svn ...

  9. 判断括号字符串是否为合法+求n对括号的所有组合

    n对括号的有效组合数 参考:https://zh.wikipedia.org/wiki/%E5%8D%A1%E5%A1%94%E5%85%B0%E6%95%B0 import java.util.Ar ...

  10. incallui中如何查询联系人数据

    联系人信息显示在CallCard中,提示当前正在通话的联系人号码.姓名.头像.号码类型等信息: 代码中在两个地方发起对当前联系人的查询, Init():startContactInfoSearch(c ...