前言

周末逛知乎的时候,看到的一个经典面试题目: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. 如何在RHEL7上搭建Samba服务实现Windows与Linux之间的文件共享

    如何在RHEL7上搭建Samba服务实现Windows与Linux之间的文件共享 实现环境:VMware workstations.RHEL7.0 第一步:配置网卡IP及yum软件仓库 命令:vim ...

  2. struts2 内容记录

    多xml文件配置 在开发过程中我们经常会将每一张表(如:user表)的struts.xml文件分开,便于管理,故需要建立struts_user.xml文件管理请求等.那么需要用到inculde标签. ...

  3. pt-online-schema-change和默认值关系

    在使用pt-online-schema-change会遇到如下的错误导致表修改失败: Copying rows caused a MySQL error 1364,Message: Field 'XX ...

  4. 关于iOS GangSDK的使用,为App快速集成社群公会模块

    手上有一个自己开发的小游戏,想加一个家族系统活跃下游戏的氛围,想到这块儿可能会有大量的工作需要自己做,就偷了个懒去网上搜罗了一波,结果惊奇的发现居然真的有类似的服务,并且还是免费的,所以决定入坑尝试一 ...

  5. ssh、scp免秘钥远程执行命令:expect

    首先安装expect # yum -y install expect 命令格式 # ./expect IP COMM    #expect是独立的工具,所以不能用sh来执行 1 2 3 4 5 6 7 ...

  6. python从2.7升级到3.5 需要主要的问题

    今天鼓足勇气把我们python从2.7升级到3.5.我用的是pycharm开发工具.升级过程遇到一些问题小结下: 1.右击项目: 找到左侧 project interpreter选项,配置项目开发环境 ...

  7. Java爬虫框架WebMagic——入门(爬取列表类网站文章)

    初学爬虫,WebMagic作为一个Java开发的爬虫框架很容易上手,下面就通过一个简单的小例子来看一下. WebMagic框架简介 WebMagic框架包含四个组件,PageProcessor.Sch ...

  8. python并发编程之多线程一

    一,什么是线程 线程也被称为轻量进程计算机科学术语,指运行中的程序的调度单位. 线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程.线程不拥有系统资源,只有运行必须的一些数据结构: ...

  9. 【转】npm包管理器那些事

    原文链接:http://www.cnblogs.com/shuoer/p/7782125.html npm包管理器那些事! 今天和朋友针对npm包全局安装和本地项目安装这个梗展开的激烈的讨论,故此做一 ...

  10. spring框架的一些技术总结

    纵观现在互联网行业,java的地位依然不可动摇,因为java拥有着的众多开发人员和适用性广,技术与解决技术大部分开源等特点,因此java依然是众多众多开发行业作为互联网开发的首选,而说到开发,我们就不 ...