10个接口访问日志文件,每个文件约300MB,每个文件的日志都是按照时间戳从小到大排序的,将10个文件合并为1个文件,仍按照时间戳从小到大排列,如果处理任务的机器内存只有1GB,有什么好的解决思路,能"快速"地将这10个文件合并?
先构建十条io流,分别指向十个文件,每条io流读取对应文件的第一条数据,
然后比较时间戳,选择出时间戳最小的那条数据,将其写入一个新的文件,
然后指向该时间戳的io流读取下一行数据,然后继续刚才的操作,比较选出最小的时间戳数据,写入新文件,io流读取下一行数据,
以此类推,完成文件的合并,
这种处理方式,日志文件有n个,数据就要比较n次,每次比较选出一条数据来写入,时间复杂度是O(n),空间复杂度是O(1),几乎不占用内存,
计数排序
- 解决: 将数据存储在数组中,内存占用80MB,从小到大排序,再二分查找算法
- 散列表和二叉树等支持快速查找的动态数据结构,大部分情况下,二分查找可以解决的问题,用上述两种数据结构都可以解决
- 但是,上述两种结构需要比较多的额外的内存空间,100MB内存存不下
- 二分查找底层依赖的是数组,除了数据本身以外,不需要额外存储其他信息,最省内存
- 第一种是深度优先思想的递归,分别求左右子树的高度。当前节点的高度就是左右子树中较大的那个+1
- 第二种可以采用层次遍历的方式,每一层记录都记录下当前队列的长度,这个是队尾,每一层队头从0开始。
然后每遍历一个元素,队头下标+1。直到队头下标等于队尾下标。这个时候表示当前层遍历完成。
每一层刚开始遍历的时候,树的高度+1。最后队列为空,就能得到树的高度。
为了返回最优的IP,即离用户最近的IP,提高访问速度
一次会话,多个命令要么都执行成功,要么都执行失败
假设你的表里面已经有了 city_name(city, name) 这个联合索引,然后你要查杭州和苏州两个城市中所有的市民的姓名,并且按名字排序,显示前 100 条记录。需要实现一个在数据库端不需要排序的方案,你会怎么实现呢?
相当于将一个二进制数字,转换为58进制
counter = current_time # for example 15:03
count = INCR counter
EXPIRE counter 60 # just to make sure redis doesn't store it forever
if count > 5
print "Exceeded the limit"
- 进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。
- 线程是进程的一个实体,是CPU调度和分派的基本单位,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据
- 协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈
1. grep: 文本搜索 ps -ef|grep java:查找指定进程
2. cp: 复制文件 cp file1 file2 file3 dir :把文件file1、file2、file3复制到目录dir中
3. mv: 移动文件、目录或更名 mv file1 file2 file3 dir : 把文件file1、file2、file3移动到目录dir中 mv file1 file2 : 把文件file1重命名为file2
4. rm
5. ps: 列出系统中当前运行的进程
6. kill: 杀死进程
7. tar: 压缩,解压
8. chmod: 改变文件权限
9. tail: tail -f 20160921.logs :查看正在改变的日志文件 tail -3000 catalina.out:查看倒数前3000行的数据 tail -3000 catalina.out | grep 'AA':查看倒数前3000行包含字母'AA'的数据
10. lsof -i:8080:根据端口查看进程pid
11. ps -ef|grep ganache-cli | grep -v grep|sort -nrk2|head -n 1|awk '{print $1,$4}'
-v : 屏蔽
wc chap1: 显示文件中的行数,字数,和字节数
sort -nrk2: r: 从大到小 k2:第几列
head -n 1: 头部的 1行
awk '{print $1,$4}' log.txt: 输出文本中的1、4项
12. top:查看当前系统的运行情况
13. tar: 解压
14. du -sh * | sort -n
查看当前目录大小,并按文件大小排序
1,ps -ef|grep mysql
2. netstat -anp|grep 3306
3. lsof -i:3306 (list of file )
在GUN/Linux操作系统中,/proc是一个位于内存中的伪文件系统(in-memory pseudo-file system)。
该目录下保存的不是真正的文件和目录,而是一些“运行时”信息,如系统内存、磁盘io、设备挂载信息和硬件配置信息等。
proc目录是一个控制中心,用户可以通过更改其中某些文件来改变内核的运行状态。
proc目录也是内核提供给我们的查询中心,我们可以通过这些文件查看有关系统硬件及当前正在运行进程的信息
不同机器部署不同的服务,对外暴露一个系统
不同机器相同的服务,对外暴露一个服务
平衡的将任务分给集群中的每一个服务
就是用逆向归纳的方法:如果最后你拿完剩1、2、3、4、5个球,那么则是对方拿到了第100个球。所以你的目标就是剩余6个球,这样无论对方怎么拿,你都能拿到100个球。由此类推,倒数第二次,你的目标就是剩余12个球,这样不管对方拿几个,你都可以将剩余球的个数变为6个,从而变为前面说的那种情况,而拿到第100个球。于是,不难归纳出,只要每次你的目标是剩余球的个数为6的倍数,那么你肯定最终拿到第100个球。
所以,如果最开始有100个球,那么只要你先拿4个,使剩余球的个数为96个(96=16×6),那么最后拿到第100个球的肯定是你