前言

周末逛知乎的时候,看到的一个经典面试题目:http://www.zhihu.com/question/26435483。非常经典的一道分而治之的题目。

题目描写叙述例如以下:

有次面试遇到一个问题,10G的log里面每一行都保存着一个url,内存仅仅有250M,当输入一个url时,假设高速查出日志里是否有这条记录,假设有,有多少条?要求不能使用数据库,仅仅能使用文本处理。

思路

之前我的研究生导师已经从project角度分析了这个问题。这里我是简单的记录思想,并写出完整的演示样例来解决问题。
这是一道很典型的使用分治法来解决这个问题的题目。思路例如以下:
  1. 首先。考虑将10G的log文件划分为多个小于250M的文件,这样每一个小文件就能够一次性加载内存了。

  2. 当小文件能够一次性加载内存后,能够直接grep搜索,也能够对文件内容排序后,然后二分查找。
疑问:怎样避免在切分文件的过程中。误操作切断url?
解答:能够使用split按行来切分文件(注意:这里按行是依照“\n”切割,和你用vim编译器打开看到的行是不一样地)。因此,我们如果一个记录几乎相同是480byte(已经不少了),那么依照-l 500000 切割文件。那事实上每一个文件存储500000行也才240M。全然能够加载内存,也不存在url被截断的问题了。


演示样例

1. 通过一个4k大小的日志文件。构造一个1G大小的測试log文件。并添加特殊的url为“www.wangzhengyi.com”,这也是我们要查询的特殊url。
思路:cat 4k大小的日志文件256000次,每次结束时添加这个特殊的url:"www.wangzhengyi.com“。演示样例代码例如以下:
#!/bin/bash

BASE_LOG_PATH=/tmp/test/access.log.1
RES_LOG_PATH=/tmp/test/big.log
if [ -f $RES_LOG_PATH ]; then
rm -rf $RES_LOG_PATH
fi
touch $RES_LOG_PATH for i in `seq 1 256000`; do
cat $BASE_LOG_PATH >> $RES_LOG_PATH
echo "www.example.com|10.32.185.95|-[28/Oct/2014:12:34:39 +0800]|" >> $RES_LOG_PATH
done

建成之后,我们du -sh看一下文件大小确实是1G多。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3p5XzE5ODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">



2. 我们更苛刻一些,如果最多能用的内存是5k,那我们能够依照1000行来对1G的文件进行分割,然后bash shell for循环遍历分割后的文件,通过grep将特殊的url查找出来,存储到特定的文件里。演示样例脚本例如以下:
#!/bin/bash

LOAD_DIR_PATH="/tmp/test/children"
SOURCE_PATH="/tmp/test/big.log" if [ ! -d $LOAD_DIR_PATH ];then
mkdir -p $LOAD_DIR_PATH
fi cp $SOURCE_PATH $LOAD_DIR_PATH #1.split依照1000行来进行切分
NUMBER=1000
cd $LOAD_DIR_PATH
split -l $NUMBER $LOAD_DIR_PATH/big.log #2.for循环遍历查找
TARGET_URL="www.wangzhengyi.com"
TARGET_PATH="/tmp/test/res.txt"
for file in `ls $LOAD_DIR_PATH`; do
if [[ $file != "big.log" ]]; then
grep -i $TARGET_URL $file >> $TARGET_PATH
fi
done #3.统计行数(前提:总结果数不超过规定的内存限制)
echo `cat $TARGET_PATH | wc -l`

经典面试题目——250M内存处理10G大小的log文件的更多相关文章

  1. 33条C#、.Net经典面试题目及答案

    33条C#..Net经典面试题目及答案[zt] 本文集中了多条常见的C#..Net经典面试题目例如".NET中类和结构的区别"."ASP.NET页面之间传递值的几种方式? ...

  2. 33条C#、.Net经典面试题目及答案[zt]

    33条C#..Net经典面试题目及答案[zt] 本文集中了多条常见的C#..Net经典面试题目例如“.NET中类和结构的区别”.“ASP.NET页面之间传递值的几种方式?”,并简明扼要的给出了答案,希 ...

  3. C语言经典面试题目(转的,不过写的的确好!)

    第一部分:基本概念及其它问答题 1.关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被声明为静态的变量在这一 ...

  4. cc++面试------17道经典面试题目分析

    以下是C/C++面试题目,共计17个题目,其中涵盖了c的各种基础语法和算法, 以函数接口设计和算法设计为主.这17个题目在C/C++面试方面已经流行了多 年,大家需要抽时间掌握好,每一个题目后面附有参 ...

  5. C/C++经典面试题目

    1.关于动态申请内存 答:内存分配方式三种: (1)从静态存储区域分配:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.全局变量,static变量. (2)在栈上创建:在执行函数 ...

  6. 2017最新PHP经典面试题目汇总(上篇)

    1.双引号和单引号的区别 双引号解释变量,单引号不解释变量 双引号里插入单引号,其中单引号里如果有变量的话,变量解释 双引号的变量名后面必须要有一个非数字.字母.下划线的特殊字符,或者用{}讲变量括起 ...

  7. 经典面试题目C语言

    题一,堆和栈的区别是? 题二,Volatile与Register的区别是? 题三,ARM里的大端格式和小端格式分别是什么意思? 题一答案:   (1)存储内容不同 栈:在函数调用时,栈中存放的是函数中 ...

  8. PHP经典面试题目汇总

    1.双引号和单引号的区别 双引号解释变量,单引号不解释变量 双引号里插入单引号,其中单引号里如果有变量的话,变量解释 双引号的变量名后面必须要有一个非数字.字母.下划线的特殊字符,或者用{}讲变量括起 ...

  9. 33条C#和.NET经典面试题目及答案

    1. .NET中类和结构的区别? 答:结构和类具有大体的语法,但是结构受到的限制比类要多. a. 结构不能有默认的构造函数,因为结构的副本是用编译器创建和销毁的,所以不需要默认的构造函数和析构函数. ...

随机推荐

  1. Java中Date日期字符串格式的各种转换

    public class DateParserT {           /**          * Date 与  String.long 的相互转换          * @param args ...

  2. Java 核心内容相关面试题【2】

    第一,谈谈final, finally, finalize的区别. final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 ...

  3. Vue.js优雅的实现列表清单的操作

        一.Vue.js简要说明 Vue.js (读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架.与前端框架Angular一样, Vue.js在设计上采用MVVM模式,当Vie ...

  4. spring AOP 和自定义注解进行身份验证

    一个SSH的项目(springmvc+hibernate),需要提供接口给app使用.首先考虑的就是权限问题,app要遵循极简模式,部分内容无需验证,用过滤器不能解决某些无需验证的方法 所以最终选择用 ...

  5. Spring AOP高级——源码实现(2)Spring AOP中通知器(Advisor)与切面(Aspect)

    本文例子完整源码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/Spring%20AOP%E9%A ...

  6. 插件lombok的介绍安装

    Lombok插件 介绍一个不错的Eclipse插件Lombok 该插件对Log4j简化的代码,因为不大,所以jar包也存在呢! Lombox是Eclipse的一个插件,用来自动生成Java代码,减少手 ...

  7. 使用composer更新thinkphp5或则yii2的版本

    更新thinkphp5或则yii2的版本,我目前采用的是用composer去更新,小伙伴们如果有其他更好的办法更新,可以直接评论给我,不胜感激啊. 如果还没有安装 Composer ,你可以按 Com ...

  8. [转载] gitbook安装与使用

    转载自http://blog.csdn.net/xiaocainiaoshangxiao/article/details/46882921 废话不说,直接主题: gitbook安装 ========= ...

  9. RabbitMQ之Topics(多规则路由)

    Exchange中基于direct类型无法基于多种规则进行路由. 例如分析syslog日志,不仅需要基于severity(info/warning/critical/error)进行路由,还需要基于a ...

  10. javascript第六章--BOM

    ① window对象 ② location对象 ③ navigator对象 ④ screen对象 ⑤ history对象